Модуль 1 · Данные и имена

Справочник по Python · модуль 1 · данные и имена

Глава 1.5

1.5

Функция input():
ввод данных

До сих пор все числа мы записывали прямо в код. Программа считала одно и то же при каждом запуске. Функция input() меняет это: теперь данные приходят от человека за клавиатурой — и с ними приходит первая настоящая проблема, к которой нас готовила прошлая глава.

Категория
Синтаксис и базовые концепции
Уровень
Начальный
Связанные темы
Типы данных, вывод, исключения
Зачем это знать
Получать данные от пользователя и приводить их к нужному типу

§1Что делает input()

Функция input() получает данные от пользователя с клавиатуры. Выполнение программы на этой строке останавливается: интерпретатор ждёт, пока человек наберёт текст и нажмёт Enter. Введённое значение становится результатом функции — его и присваивают переменной.

Синтаксисinput
переменная = input("текст подсказки")

Разберём по шагам, что происходит при выполнении двух строк:

main.pyпервый ввод
name = input("Введите ваше имя: ")
print(name)
Вывод в терминалсиним — то, что набрал пользователь
Введите ваше имя: Алексей
Алексей
  1. Программа выводит подсказку Введите ваше имя: и оставляет курсор на той же строке.
  2. Выполнение останавливается — программа ждёт, ничего больше не делая.
  3. Пользователь набирает текст и нажимает Enter.
  4. Введённое значение сохраняется в переменной name, и выполнение идёт дальше.
На полях: программа не зависла

Самое частое недоумение на первом занятии — «программа запустилась и ничего не делает». Скорее всего, она дошла до input() и ждёт вас. Такое ожидание не ограничено по времени: пока не будет нажат Enter, следующая строка не выполнится. Прервать ожидание можно сочетанием Ctrl+C.

§2Подсказка для пользователя

Текст в скобках называется подсказкой: он объясняет, что именно от человека требуется. Подсказка выводится ровно как написана, поэтому в её конце ставят пробел — иначе введённый текст прилипнет к двоеточию.

Сравнитепробел в конце подсказки
age = input("Ваш возраст:")    # Ваш возраст:18
age = input("Ваш возраст: ")   # Ваш возраст: 18

Подсказку можно не передавать вовсе — input() без аргументов тоже работает. Но тогда пользователь увидит пустую строку и мигающий курсор без единого пояснения, что от него хотят. Считайте подсказку обязательной: это часть интерфейса вашей программы, а не украшение.

Хорошая подсказка называет и величину, и единицу измерения: "Расстояние, км: " понятнее, чем "Введите число: ". Человек не обязан догадываться, в чём вводить.

§3input() всегда возвращает строку

Это главное свойство функции, и запомнить его нужно сразу: input() возвращает значение типа str — всегда, при любом вводе. Даже когда пользователь набрал одни цифры.

main.pyпроверяем тип введённого
age = input("Введите ваш возраст: ")
print(age)
print(type(age))
Вывод в терминалпользователь ввёл 18
Введите ваш возраст: 18
18
<class 'str'>

На экране 18 и 18 выглядят одинаково, но для программы это строка из двух символов, а не число. Со строкой не работает арифметика: age + 1 завершится с TypeError, а age * 2 даст 1818 вместо 36. Мы разбирали это различие в главе о типах данных — вот задача, ради которой оно и нужно.

Ведёт себя так функция не по недосмотру. Она читает символы, набранные на клавиатуре, и не может решать за вас, что такое 007 — номер, код или число семь. Решение остаётся за автором программы.

§4Преобразование при вводе

Чтобы считать введённое значение числом, его преобразуют явно — функциями int() и float(). Обычно это делают прямо в строке ввода, не заводя лишнего имени: сначала выполняется input(), затем полученная строка передаётся в int().

main.pyцелое число
age = int(input("Введите ваш возраст: "))
print("Ваш возраст:", age)
print(type(age))
Вывод в терминалрезультат запуска
Введите ваш возраст: 18
Ваш возраст: 18
<class 'int'>

Теперь в переменной лежит число, и с ним допустимы вычисления. Для дробных величин — вес, цена, рост — берут float():

main.pyдробное число
weight = float(input("Введите ваш вес, кг: "))
print(weight)      # 72.5
print(type(weight))  # <class 'float'>

Правило выбора простое: int() — для того, что считают штуками (возраст, количество, год), float() — для того, что измеряют (вес, цена, длина). Если сомневаетесь, берите float(): он примет и 72, и 72.5, тогда как int() на дробном вводе остановит программу с ошибкой.

§5Разбор задачи: среднее двух чисел

Соберём всё вместе. Программа спрашивает два числа и выводит их среднее.

main.pyполная программа
num1 = int(input("Введите первое число: "))
num2 = int(input("Введите второе число: "))

average = (num1 + num2) / 2

print("Среднее значение:", average)
Вывод в терминалввели 5 и 8
Введите первое число: 5
Введите второе число: 8
Среднее значение: 6.5

Каждый input() — отдельная остановка: программа дождётся первого числа, только потом выведет вторую подсказку. Результат получился дробным, хотя вводили целые: деление / всегда возвращает float. Если по условию задачи нужно целое, результат приводят явно:

main.pyцелое среднее
average = int((num1 + num2) / 2)

print("Среднее целое значение:", average)   # 6
int() отбрасывает, а не округляет

Из 6.5 получилось 6, и из 6.9 тоже получится 6: дробная часть просто отсекается. Тот же результат даёт целочисленное деление (num1 + num2) // 2 — запись короче. А если нужно именно округление по правилам, до ближайшего, берите round((num1 + num2) / 2). Три разных инструмента для трёх разных задач — выбирайте осознанно.

§6Преобразование в обе стороны

Преобразование работает не только на входе. Обратный перевод — числа в строку — нужен, когда значение требуется склеить с текстом.

Pythonстрока → число и обратно
# строка → число
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-строка подставит значение любого типа сама.

Pythonдва способа вывести число с текстом
total = 4395.83

print("Итого: " + str(total) + " руб.")   # работает, но громоздко
print(f"Итого: {total} руб.")              # так короче и понятнее

§7Когда ввели не то

Запись int(input()) исходит из того, что пользователь введёт число. Но вводит человек, а человек ошибается, отвлекается и понимает подсказку по-своему. Если в int() попадёт что-то другое, программа остановится с ошибкой ValueError прямо на строке ввода.

Пользователь ввёлРезультат int(...)
1818 — всё в порядке
 18  с пробелами по краям18 — пробелы по краям int() отбрасывает сам
18 летValueError: invalid literal for int() with base 10: '18 лет'
18.5ValueError — для дробного нужен float()
ничего, просто EnterValueError — пустая строка не является числом

Полноценная защита от такого ввода — это try / except, и ей отведена отдельная глава в модуле об ошибках. Пока достаточно понимать причину и знать один приём для дробных чисел: у нас принято писать десятичный разделитель запятой, а Python понимает только точку. Заменить одно на другое можно сразу при вводе.

main.pyпринимаем и 72.5, и 72,5
raw = input("Введите ваш вес, кг: ")
weight = float(raw.replace(",", "."))

print(weight)

Здесь ввод сначала сохранён в переменную raw — «сырое» значение, — и только потом преобразован. Такой порядок удобен, когда со строкой нужно что-то сделать до превращения в число.

§8Частые ошибки

Что написаноЧто произойдётКак правильно
age = input("Возраст: "), затем age + 1TypeError — к строке нельзя прибавить числоage = int(input("Возраст: "))
n = input(), затем n * 21818 вместо 36 — строка повториласьпреобразовать при вводе: n = int(input())
int(input("Вес: ")) для веса 72.5ValueError — 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() — обычно прямо в строке ввода. С этой главы программа перестала быть расчётом с зашитыми числами и стала инструментом, которым может воспользоваться другой человек.

Глава 1.5 · Функция input(): ввод данных · Справочник по Python Автор: Макаров Максим Николаевич