input() в Python 3: ввод данных пользователем
Функция input() в Python 3 читает строку, которую пользователь вводит с клавиатуры, и возвращает ее программе. Ниже разобрано, как вывести подсказку, превратить ввод в число, прочитать несколько значений из одной строки, обработать неверный ввод и быстро считывать большие объемы данных в олимпиадных задачах.

Содержание статьи
Синтаксис и принцип работы
У функции один необязательный параметр prompt - текст подсказки, который выводится перед ожиданием ввода:
input(prompt='')Когда программа доходит до вызова, она печатает подсказку без перевода строки и останавливается, пока пользователь не нажмет Enter. Затем функция возвращает введенный текст. Символ конца строки в результат не попадает.
name = input('Введите свое имя: ')
print(f'Привет, {name}!')
# Введите свое имя: Тимур
# Привет, Тимур!Подсказку удобно заканчивать пробелом или двоеточием с пробелом, иначе ввод пользователя прилипнет к тексту. Если подсказка не нужна, функцию вызывают без аргументов: line = input(). Как input() сочетается с выводом через print(), подробнее рассказано в статье про ввод и вывод в Python.
input() всегда возвращает строку
Что бы ни ввел пользователь, результат имеет тип str. Это главный источник ошибок у начинающих: при сложении двух введенных чисел строки склеиваются, а не суммируются.
a = input('Первое число: ') # 2
b = input('Второе число: ') # 3
print(a + b) # 23
print(type(a)) # <class 'str'>Чтобы работать с числами, ввод преобразуют сразу при чтении:
age = int(input('Возраст: '))
height = float(input('Рост в метрах: '))
print(age + 1, height * 100)int() принимает только запись целого числа, пробелы по краям допускаются. Строка '1.75' для него ошибочна. float() принимает и целые, и дробные числа, но разделителем должна быть точка: на '1,75' он выдаст ValueError. Если пользователи привыкли к запятой, замените ее заранее: float(s.replace(',', '.')).
Несколько значений в одной строке
В учебных и олимпиадных задачах данные часто приходят одной строкой через пробел. Метод split() делит строку на части, а map() применяет преобразование к каждой из них.
a, b = map(int, input().split()) # ввод: 5 7
print(a * b) # 35
nums = list(map(int, input().split())) # ввод: 3 1 4 1 5
print(sum(nums), max(nums)) # 14 5
x, y = map(float, input().split(';')) # ввод: 1.5;2.5
print(x + y) # 4.0Без аргумента split() делит по любым пробельным символам и игнорирует лишние пробелы. С аргументом он делит строго по указанному разделителю. Подробнее о разбиении строк написано в статье про split, а о функции map() в материале про zip и map.
При распаковке число переменных должно совпадать с числом введенных значений. Если ввести одно число там, где ждут два, появится ValueError: not enough values to unpack (expected 2, got 1).
Ввод нескольких строк
Когда сначала вводится количество строк, а затем сами строки, используют генератор списка. Если количество заранее неизвестно, читают до пустой строки.
n = int(input())
words = [input() for _ in range(n)]
lines = []
while (line := input()) != '':
lines.append(line)Оператор := присваивает значение прямо в условии цикла и доступен с Python 3.8.
Проверка ввода и обработка ошибок
Пользователь может ввести что угодно, поэтому программа не должна падать на первой опечатке. Преобразование помещают в блок try и повторяют запрос в цикле, пока данные не станут корректными.
def ask_int(prompt, low=None, high=None):
while True:
try:
value = int(input(prompt))
except ValueError:
print('Введите целое число')
continue
if (low is None or value >= low) and (high is None or value <= high):
return value
print(f'Допустимо от {low} до {high}')
month = ask_int('Номер месяца: ', 1, 12)Кроме ValueError, при вводе встречаются еще два исключения. EOFError возникает, если поток ввода закончился: пользователь нажал Ctrl+D в Linux или Ctrl+Z и Enter в Windows, либо данные из файла кончились. KeyboardInterrupt появляется при нажатии Ctrl+C. Подробнее о перехвате ошибок рассказано в статье про обработку исключений.
Быстрый ввод через sys.stdin
Для одной-двух строк input() подходит идеально. Но если нужно прочитать сотни тысяч строк, например в задачах на Codeforces или в ЕГЭ по информатике с файлами, удобнее работать с sys.stdin напрямую: накладные расходы на каждую строку меньше.
import sys
input = sys.stdin.readline # быстрая замена
n = int(input())
data = list(map(int, input().split()))
# или прочитать сразу все числа до конца ввода
numbers = list(map(int, sys.stdin.read().split()))В отличие от встроенной функции, sys.stdin.readline() оставляет в конце символ \n. Для чисел это не важно, int() его проигнорирует, а у строк конец нужно убрать вызовом rstrip('\n').
Сравнение способов ввода
В таблице собраны основные способы получить данные от пользователя в консольной программе.
| Способ | Что возвращает | Когда использовать |
|---|---|---|
input() | Строку без \n | Диалог с пользователем, небольшой ввод |
int(input()) | Целое число | Одно число в строке |
map(int, input().split()) | Итератор чисел | Несколько чисел в одной строке |
sys.stdin.readline() | Строку с \n | Большой объем данных |
getpass.getpass() | Строку, ввод не отображается | Пароли и секретные ключи |
Функция getpass() из модуля getpass работает как input(), но не показывает набираемые символы на экране. В некоторых IDE, где нет настоящего терминала, она выводит предупреждение и показывает ввод.
Частые вопросы
Ответы на вопросы, которые часто возникают при работе с input().
Чем input() в Python 3 отличается от Python 2?
В Python 2 было две функции: raw_input() возвращала строку, а input() выполняла введенный текст как выражение. В Python 3 осталась только input(), и она работает как старая raw_input(), то есть всегда возвращает строку.
Как ввести список чисел?
Если числа идут через пробел: nums = list(map(int, input().split())). Вариант с генератором списка дает тот же результат: [int(x) for x in input().split()].
Почему программа зависает на input()?
Функция ждет ввода, пока не будет нажат Enter. В некоторых онлайн-редакторах и средах запуска ввод нужно заранее записать в отдельное поле stdin, иначе программа получит EOFError или будет ждать бесконечно.
Можно ли задать значение по умолчанию?
Встроенного параметра нет, но легко сделать так: city = input('Город [Москва]: ') or 'Москва'. Пустая строка считается ложной, поэтому при простом нажатии Enter подставится значение по умолчанию.