Программа, которая всегда печатает одно и то же, – это не программа, а открытка. Полезная программа умеет спрашивать: калькулятор считает те числа, которые ввёл человек; игра здоровается тем именем, которое он назвал; тест проверяет именно тот ответ, который выбрал ученик.
Значит, нужен способ получить данные от пользователя прямо во время работы программы – и способ показать ему результат. За это отвечают две встроенные функции: print() и input().
В этом уроке: как управлять выводом print(), как input() останавливает программу и ждёт человека, почему введённое число на самом деле не число и как это исправить функциями int() и float().
Функция print(): управляем выводом
print() – встроенная функция вывода: она печатает на экран всё, что ей передали в скобках. Значений можно передать сразу несколько через запятую – тогда print() сама расставит между ними пробелы и в конце перейдёт на новую строку.
Этот пробел и перевод строки – не жёстко зашитое поведение, а значения по умолчанию у двух необязательных именованных параметров:
sep (separator) – что печатать между переданными значениями. По умолчанию sep=' ' – один пробел.
end – что напечатать в самом конце, после всех значений. По умолчанию end='\n' – символ перевода строки, поэтому следующий print() всегда начинает вывод с новой строки.
Оба параметра можно переопределить, если нужно другое поведение – например, вывести числа через дефис вместо пробела, или, наоборот, оставить курсор на той же строке, чтобы следующий print() дописал текст рядом, а не с новой строки.
Вызов print() вообще без аргументов печатает пустую строку – так делают отступ между блоками вывода.
print(1, 2, 3) # 1 2 3 – по умолчанию sep=' '
print(1, 2, 3, sep='-') # 1-2-3 – свой разделитель
print('Привет', end='') # без перевода строки в конце
print('!') # допишется на той же строке
# итог двух строк выше: Привет!
Функция input(): как программа спрашивает пользователя
input() – функция, которая приостанавливает выполнение программы, ждёт, пока пользователь наберёт текст и нажмёт Enter, и возвращает то, что он ввёл.
В скобки можно передать текст подсказки – она покажется перед вводом на той же строке, чтобы пользователь понимал, чего от него ждут:
name = input('Как тебя зовут? ')
print('Привет,', name)
Пока input() ждёт ввода, программа буквально стоит на месте – это единственная команда из уже известных, которая заставляет выполнение «замереть» до реакции человека.
Диалог программы и пользователя: программа выводит вопрос, человек вводит ответ, программа продолжает работу с этим значением.
Ловушка: input() всегда возвращает строку
Ключевой момент этого урока: что бы пользователь ни ввёл – хоть 25, хоть привет – input() возвращает значение типа str, никогда не число. Даже если на экране человек видит цифры, для Python это просто текст из цифровых символов.
Из-за этого прямая попытка посчитать что-то с результатом input() работает не так, как ожидается – либо Python склеит значения как строки (+ для строк означает конкатенацию, а не сложение), либо вовсе откажется выполнять операцию между строкой и числом.
age = input('Сколько тебе лет? ')
print(type(age)) # <class 'str'> – даже если ввели 16
print(age + 1)
# TypeError: can only concatenate str (not "int") to str
# нельзя сложить строку и число напрямую
Приведение типов: int() и float()
Приведение типов – явное превращение значения одного типа в другой.
Для этого есть функции int() и float(). Слова int и float – это названия типов данных (целое и вещественное число), но их же можно вызвать как функции-преобразователи: int(x) превращает x в целое число, float(x) – в вещественное. Обе понимают строку, если она полностью состоит из подходящих символов (цифры, при необходимости знак минуса и точка для float()).
Правильный паттерн для чисел, введённых пользователем – сразу оборачивать input() в нужную функцию, а не сохранять строку отдельным шагом:
age = int(input('Сколько тебе лет? '))
age = int(input('Сколько тебе лет? '))
print('Через год тебе будет', age + 1) # уже работает
Если пользователь введёт не число
Если внутрь int() попадёт строка, которая не является целым числом (например, пользователь по ошибке ввёл своё имя вместо возраста), Python выдаст ошибку ValueError и программа немедленно остановится.
Пока просто фиксируем этот факт как данность – аккуратная обработка таких ситуаций потребует конструкции, с которой мы познакомимся позже в курсе.
Коротко
print() выводит переданные значения; параметр sep задаёт разделитель между ними (по умолчанию пробел), end – что напечатать в конце (по умолчанию перевод строки).
input() останавливает программу, ждёт ввод с клавиатуры и возвращает набранное; текст в скобках – подсказка пользователю.
input() всегда возвращает str, даже если ввели цифры. Складывать строку с числом Python отказывается (TypeError).
Чтобы считать число, ввод сразу оборачивают в преобразователь: n = int(input()) или x = float(input()).
Если внутрь int() попадёт не число, программа остановится с ValueError.
Проверь себя
Короткие вопросы по теме урока. Попыток сколько угодно, на прохождение блока они не влияют – это проверка для себя.