It is always text
typed = input("Age: ") # user types 42
typed + typed # "4242", not 84
This is the first surprise everyone meets. input cannot know whether "42" is meant as a number, a house number or a password, so it does not guess. Convert explicitly:
age = int(input("Age: "))
Convert defensively
That one-liner raises ValueError the moment somebody types "forty" or presses enter on an empty line. For anything a real person will use:
def read_int(text, default=0):
try:
return int(text.strip())
except (ValueError, AttributeError):
return default
strip() first, because people type spaces.
The prompt is an argument
input("Your name: ") prints the prompt and reads on the same line. A separate print before it works too but puts the cursor on the next line, which reads worse.
print has two useful options
print("a", "b", sep="-") # a-b
print(i, end=" ") # no newline
sep sits between the values; the default is a single space. end goes after them; the default is a newline. end="" is how you build a line across several prints — and you then need a bare print() to close it, which the page demonstrates.
print versus f-strings
print calls str() on whatever you give it, which is fine for quick output. When the formatting matters — decimal places, alignment, thousands separators — build the string yourself with an f-string and print that. The two are complementary, not competing.
One detail worth noticing: printing a list shows its repr, so strings appear with quotes. ", ".join(items) is what you want when the output is for a person.