Справочник по Python · модуль 1 · данные и имена
Глава 1.5
Функция input():
ввод данных
До сих пор все числа мы записывали прямо в код. Программа считала одно и то же при каждом запуске. Функция input() меняет это: теперь данные приходят от человека за клавиатурой — и с ними приходит первая настоящая проблема, к которой нас готовила прошлая глава.
- Категория
- Синтаксис и базовые концепции
- Уровень
- Начальный
- Связанные темы
- Типы данных, вывод, исключения
- Зачем это знать
- Получать данные от пользователя и приводить их к нужному типу
§1Что делает input()
Функция input() получает данные от пользователя с клавиатуры. Выполнение программы на этой строке останавливается: интерпретатор ждёт, пока человек наберёт текст и нажмёт Enter. Введённое значение становится результатом функции — его и присваивают переменной.
переменная = input("текст подсказки")
Разберём по шагам, что происходит при выполнении двух строк:
name = input("Введите ваше имя: ") print(name)
Введите ваше имя: Алексей
Алексей
- Программа выводит подсказку
Введите ваше имя:и оставляет курсор на той же строке. - Выполнение останавливается — программа ждёт, ничего больше не делая.
- Пользователь набирает текст и нажимает Enter.
- Введённое значение сохраняется в переменной
name, и выполнение идёт дальше.
Самое частое недоумение на первом занятии — «программа запустилась и ничего не делает». Скорее всего, она дошла до input() и ждёт вас. Такое ожидание не ограничено по времени: пока не будет нажат Enter, следующая строка не выполнится. Прервать ожидание можно сочетанием Ctrl+C.
§2Подсказка для пользователя
Текст в скобках называется подсказкой: он объясняет, что именно от человека требуется. Подсказка выводится ровно как написана, поэтому в её конце ставят пробел — иначе введённый текст прилипнет к двоеточию.
age = input("Ваш возраст:") # Ваш возраст:18 age = input("Ваш возраст: ") # Ваш возраст: 18
Подсказку можно не передавать вовсе — input() без аргументов тоже работает. Но тогда пользователь увидит пустую строку и мигающий курсор без единого пояснения, что от него хотят. Считайте подсказку обязательной: это часть интерфейса вашей программы, а не украшение.
Хорошая подсказка называет и величину, и единицу измерения: "Расстояние, км: " понятнее, чем "Введите число: ". Человек не обязан догадываться, в чём вводить.
§3input() всегда возвращает строку
Это главное свойство функции, и запомнить его нужно сразу: input() возвращает значение типа str — всегда, при любом вводе. Даже когда пользователь набрал одни цифры.
age = input("Введите ваш возраст: ") print(age) print(type(age))
Введите ваш возраст: 18
18
<class 'str'>
На экране 18 и 18 выглядят одинаково, но для программы это строка из двух символов, а не число. Со строкой не работает арифметика: age + 1 завершится с TypeError, а age * 2 даст 1818 вместо 36. Мы разбирали это различие в главе о типах данных — вот задача, ради которой оно и нужно.
Ведёт себя так функция не по недосмотру. Она читает символы, набранные на клавиатуре, и не может решать за вас, что такое 007 — номер, код или число семь. Решение остаётся за автором программы.
§4Преобразование при вводе
Чтобы считать введённое значение числом, его преобразуют явно — функциями int() и float(). Обычно это делают прямо в строке ввода, не заводя лишнего имени: сначала выполняется input(), затем полученная строка передаётся в int().
age = int(input("Введите ваш возраст: ")) print("Ваш возраст:", age) print(type(age))
Введите ваш возраст: 18
Ваш возраст: 18
<class 'int'>
Теперь в переменной лежит число, и с ним допустимы вычисления. Для дробных величин — вес, цена, рост — берут float():
weight = float(input("Введите ваш вес, кг: ")) print(weight) # 72.5 print(type(weight)) # <class 'float'>
Правило выбора простое: int() — для того, что считают штуками (возраст, количество, год), float() — для того, что измеряют (вес, цена, длина). Если сомневаетесь, берите float(): он примет и 72, и 72.5, тогда как int() на дробном вводе остановит программу с ошибкой.
§5Разбор задачи: среднее двух чисел
Соберём всё вместе. Программа спрашивает два числа и выводит их среднее.
num1 = int(input("Введите первое число: ")) num2 = int(input("Введите второе число: ")) average = (num1 + num2) / 2 print("Среднее значение:", average)
Введите первое число: 5 Введите второе число: 8 Среднее значение: 6.5
Каждый input() — отдельная остановка: программа дождётся первого числа, только потом выведет вторую подсказку. Результат получился дробным, хотя вводили целые: деление / всегда возвращает float. Если по условию задачи нужно целое, результат приводят явно:
average = int((num1 + num2) / 2) print("Среднее целое значение:", average) # 6
Из 6.5 получилось 6, и из 6.9 тоже получится 6: дробная часть просто отсекается. Тот же результат даёт целочисленное деление (num1 + num2) // 2 — запись короче. А если нужно именно округление по правилам, до ближайшего, берите round((num1 + num2) / 2). Три разных инструмента для трёх разных задач — выбирайте осознанно.
§6Преобразование в обе стороны
Преобразование работает не только на входе. Обратный перевод — числа в строку — нужен, когда значение требуется склеить с текстом.
# строка → число num_str = "123" num_int = int(num_str) # число → строка num_int = 123 num_str = str(num_int)
На экране print(num_str) и print(num_int) выведут одинаковые 123 — разницу видно только через type() и по тому, что с этими значениями разрешено делать. Обратите внимание: исходное значение при преобразовании не меняется, функция возвращает новое. Строка int(num_str) сама по себе бесполезна — результат нужно куда-то присвоить.
Для вывода текста вместе с числом str() обычно не требуется: f-строка подставит значение любого типа сама.
total = 4395.83 print("Итого: " + str(total) + " руб.") # работает, но громоздко print(f"Итого: {total} руб.") # так короче и понятнее
§7Когда ввели не то
Запись int(input()) исходит из того, что пользователь введёт число. Но вводит человек, а человек ошибается, отвлекается и понимает подсказку по-своему. Если в int() попадёт что-то другое, программа остановится с ошибкой ValueError прямо на строке ввода.
| Пользователь ввёл | Результат int(...) |
|---|---|
18 | 18 — всё в порядке |
18 с пробелами по краям | 18 — пробелы по краям int() отбрасывает сам |
18 лет | ValueError: invalid literal for int() with base 10: '18 лет' |
18.5 | ValueError — для дробного нужен float() |
| ничего, просто Enter | ValueError — пустая строка не является числом |
Полноценная защита от такого ввода — это try / except, и ей отведена отдельная глава в модуле об ошибках. Пока достаточно понимать причину и знать один приём для дробных чисел: у нас принято писать десятичный разделитель запятой, а Python понимает только точку. Заменить одно на другое можно сразу при вводе.
raw = input("Введите ваш вес, кг: ") weight = float(raw.replace(",", ".")) print(weight)
Здесь ввод сначала сохранён в переменную raw — «сырое» значение, — и только потом преобразован. Такой порядок удобен, когда со строкой нужно что-то сделать до превращения в число.
§8Частые ошибки
| Что написано | Что произойдёт | Как правильно |
|---|---|---|
age = input("Возраст: "), затем age + 1 | TypeError — к строке нельзя прибавить число | age = int(input("Возраст: ")) |
n = input(), затем n * 2 | 1818 вместо 36 — строка повторилась | преобразовать при вводе: n = int(input()) |
int(input("Вес: ")) для веса 72.5 | ValueError — int() не принимает дробную запись | float(input("Вес, кг: ")) |
int(input("Возраст: ") | SyntaxError — не закрыта вторая скобка | считайте скобки: их две, закрывающих тоже две |
input = "Иван" | имя функции занято, следующий input() вызовет TypeError | назвать переменную по смыслу: name = "Иван" |
name = print("Имя: ") | в name окажется None — print выводит, но ничего не возвращает | для ввода нужен input(), а не print() |
§9Проверьте себя
Какой тип будет у переменной x после строки x = input("Число: "), если пользователь ввёл 42?
str. Функция input() возвращает строку при любом вводе; цифры на клавиатуре ничего не меняют. Чтобы получить int, нужно написать x = int(input("Число: ")).
Что выведет программа: n = input() и print(n + n), если ввели 7?
77. Обе части — строки, и + их склеивает. Для суммы 14 нужно преобразовать значение при вводе: n = int(input()).
Почему int(input("Цена: ")) — плохой выбор для ввода цены?
Цена бывает дробной. Как только пользователь введёт 99.90, программа остановится с ValueError. Для измеряемых величин берут float(): он примет и 100, и 99.90.
В программе три подряд идущих input(). Сколько раз она остановится и почему подсказки не выводятся все сразу?
Три раза. Строки выполняются сверху вниз: интерпретатор доходит до первого input(), печатает его подсказку и ждёт Enter. Только после ввода он переходит к следующей строке — и лишь тогда появляется вторая подсказка.
Задача для практики: переделайте программу о поездке из главы 1.1 так, чтобы расстояние и цену топлива вводил пользователь.
Заменить две строки с данными на ввод и оставить расчёт нетронутым:
distance = int(input("Расстояние, км: "))fuel_price = float(input("Цена литра, руб.: "))
Расстояние — целое, цена — дробная. Расчёт fuel_cost и вывод менять не нужно: в переменных лежат числа, а откуда они взялись, вычислениям безразлично. Это и есть польза от разделения «данные сверху — расчёт ниже».
§10Шпаргалка
name = input("Имя: ")
# всегда str
age = int(input("Возраст: "))
w = float(input("Вес, кг: "))
s = str(123)
print(f"Итого: {total}")
int(6.9) # 6 отбросить
round(6.9) # 7 округлить
raw = input("Вес: ")
float(raw.replace(",", "."))
Итог главы
Функция input() останавливает программу и получает данные от пользователя. Её подсказка — часть интерфейса: она должна называть величину и единицу измерения. Возвращает input() всегда строку, поэтому перед вычислениями значение приводят к числу через int() или float() — обычно прямо в строке ввода. С этой главы программа перестала быть расчётом с зашитыми числами и стала инструментом, которым может воспользоваться другой человек.