💻
Разработка в IT
Опубликовано:
15.04.2026
Обновлено:
15.04.2026

Как запросить ввод от пользователя в Python: функция input()

Алексей Иванов

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

Синтаксис и базовое поведение

Функция принимает один необязательный аргумент — строку-подсказку (prompt). Если аргумент передан, Python выведет его в консоль перед ожиданием ввода:

name = input('Как тебя зовут? ')
print(f'Привет, {name}!')

Вывод:

Как тебя зовут? Алиса
Привет, Алиса!

Без аргумента input() просто ждёт ввода — курсор мигает в пустой строке. Пользователь завершает ввод нажатием Enter. Символ перевода строки (\n) в возвращаемое значение не попадает — input() его обрезает автоматически.

Если пользователь нажмёт Enter, ничего не набрав, input() вернёт пустую строку "":

>>> response = input('Введите что-нибудь: ')
Введите что-нибудь:
>>> response
''
>>> len(response)
0

Возвращаемый тип — всегда str

Независимо от того, что набрал пользователь — число, слово, символ — input() возвращает строку:

>>> age = input('Возраст: ')
Возраст: 25
>>> type(age)
<class 'str'>
>>> age + 1
TypeError: can only concatenate str (not 'int') to str

Переменная age содержит строку "25", а не число 25. Попытка прибавить 1 вызовет TypeError. Чтобы работать с числом, строку нужно преобразовать явно.

Преобразование ввода в число

Целое число — int()

age = int(input('Возраст: '))
>>> type(age)
<class 'int'>
>>> age + 1
26

Функция int() принимает строку, содержащую целое число, и возвращает int. Пробелы по краям допустимы: int(" 42 ") вернёт 42. Но если строка содержит дробную точку, буквы или пуста — int() бросит ValueError:

>>> int('3.14') → ValueError
>>> int('abc') → ValueError
>>> int('') → ValueError

Дробное число — float()

price = float(input('Цена: '))
>>> type(price)
<class 'float'>

Функция float() принимает строки вида "3.14", "42", "-0.5", "1e10". Некорректные строки вызовут ValueError.

Комбинированный приём

Иногда нужно принять и целые, и дробные числа. Проще привести ввод к float — целое число станет 42.0, дробное останется как есть. Если дробная часть не нужна — дополнительно оборачиваем в int():

number = int(float(input('Число: ')))
# '3.14' → 3.14 → 3

Обработка ошибок ввода

Если пользователь введёт буквы вместо числа, int() или float() бросит ValueError. Программа упадёт с трассировкой. Чтобы этого не произошло, оборачиваем вызов в try/except:

try:
    age = int(input('Возраст: '))
except ValueError:
    print('Ожидалось целое число')

Этот код перехватит ошибку, но выполнится только один раз. Если ввод неверный, переменная age останется неопределённой. Для полноценной защиты нужен цикл.

Цикл повторного запроса

Шаблон «спрашивать, пока не получим корректный ответ» — самый частый паттерн при работе с input():

while True:
    try:
        age = int(input('Возраст: '))
        break
    except ValueError:
        print('Введите целое число')

Цикл while True крутится бесконечно. Если int() отработал без ошибки, break прерывает цикл. Если ValueError — except выводит сообщение, и цикл повторяется.

Вынесение в функцию

def get_int(prompt):
    while True:
        try:
            return int(input(prompt))
        except ValueError:
            print('Введите целое число')


age = get_int('Возраст: ')

Аналогичная функция для float:

def get_float(prompt):
    while True:
        try:
            return float(input(prompt))
        except ValueError:
            print('Введите число')

Валидация диапазона

Корректный тип — не единственное требование. Возраст не бывает отрицательным, оценка лежит от 1 до 5, месяц — от 1 до 12:

def get_int_in_range(prompt, low, high):
    while True:
        try:
            value = int(input(prompt))
        except ValueError:
            print('Введите целое число')
            continue
        if low <= value <= high:
            return value
        print(f'Число должно быть от {low} до {high}')


month = get_int_in_range('Месяц (1-12): ', 1, 12)

Инструкция continue после except возвращает к началу цикла, минуя проверку диапазона.

Ввод нескольких значений в одну строку

Метод split() разбивает строку на список:

numbers = [int(x) for x in input('Числа: ').split()]
>>> numbers
[10, 20, 30]

Для разделителя-запятой:

numbers = [int(x) for x in input('Числа: ').split(',')]

Этот приём часто встречается в задачах на соревнованиях по программированию, где входные данные подаются через пробел.

Ввод строк с валидацией

Для строковых данных преобразование типа не нужно, но валидация может быть сложнее:

def get_non_empty(prompt):
    while True:
        value = input(prompt).strip()
        if value:
            return value
        print('Поле не может быть пустым')

Метод strip() убирает пробелы по краям. Пустая строка ложна в логическом контексте — цикл повторится.

Ввод пароля: getpass

Функция input() отображает вводимые символы. Для паролей это неприемлемо. Модуль getpass из стандартной библиотеки скрывает ввод:

from getpass import getpass


password = getpass('Пароль: ')

Символы не отображаются в терминале. В некоторых IDE (например, IDLE) getpass может работать некорректно.

Отличия input() в Python 2 и Python 3

В Python 2 существовали две функции: raw_input() и input(). Первая возвращала строку. Вторая вызывала eval() на введённом тексте — пользователь мог ввести выражение, и Python его вычислял. Это создавало серьёзную уязвимость.

Функция

Python 2

Python 3

raw_input()

возвращает строку

удалена

input()

вызывает eval() на вводе

возвращает строку

В Python 3 input() — это бывший raw_input(). Безопаснее: пользователь не может выполнить код через input().

Почему eval(input()) опасен

Иногда в устаревших примерах встречается конструкция:

# НЕ ДЕЛАЙТЕ ТАК
x = eval(input('Введите число: '))

Функция eval() выполняет любое Python-выражение. Если пользователь введёт __import__('os').system('rm -rf /'), eval() послушно выполнит команду. Безопасная альтернатива — ast.literal_eval():

import ast
>>> ast.literal_eval('42') → 42
>>> ast.literal_eval('[1, 2, 3]') → [1, 2, 3]
>>> ast.literal_eval('__import__('os')')
ValueError: malformed node or string

Ввод данных из файла и перенаправление

При перенаправлении потока ввода input() читает строку из файла:

bash

python script.py < data.txt

Когда файл закончится, input() бросит EOFError. Перехват:

lines = []
while True:
    try:
        lines.append(input())
    except EOFError:
        break

Альтернатива — sys.stdin:

import sys


for line in sys.stdin:
    print(line.strip())

Тайм-аут на ввод

Стандартная input() блокирует программу навсегда. Встроенного тайм-аута нет. На Unix-системах используют модуль signal:

import signal


def timeout_handler(signum, frame):
    raise TimeoutError('Время вышло')


signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(10)

try:
    answer = input('Ответ (10 сек): ')
    signal.alarm(0)
except TimeoutError:
    print('\nВремя истекло')

На Windows signal.SIGALRM недоступен. Там используют библиотеку inputimeout:

from inputimeout import inputimeout, TimeoutOccurred


try:
    answer = inputimeout('Ответ: ', timeout=10)
except TimeoutOccurred:
    answer = 'по умолчанию'

Множественный выбор: меню

def menu(options):
    for i, option in enumerate(options, 1):
        print(f'{i}. {option}')
    while True:
        try:
            choice = int(input('Выбор: '))
        except ValueError:
            print('Введите номер')
            continue
        if 1 <= choice <= len(options):
            return choice
        print(f'Номер от 1 до {len(options)}')


selected = menu(['Создать', 'Открыть', 'Выйти'])

Подтверждение действия (да/нет)

def confirm(prompt):
    while True:
        answer = input(f'{prompt} (да/нет): ').strip().lower()
        if answer in ('да', 'д', 'yes', 'y'):
            return True
        if answer in ('нет', 'н', 'no', 'n'):
            return False
        print('Введите \'да\' или \'нет\'')

Метод lower() приводит ответ к нижнему регистру — «Да», «ДА», «да» обрабатываются одинаково.

Форматирование подсказки

Строка-подсказка принимает f-строки и escape-последовательности:

min_age = 18
age = int(input(f'Возраст (не менее {min_age}): '))

Перенос строки внутри подсказки:

choice = input('Выберите действие:\n1. Создать\n2. Удалить\n> ')

Если подсказка длинная, её разбивают на отдельный print() и вызывают input() без аргумента. В подсказке часто добавляют пробел в конце ("Имя: " вместо "Имя:"), чтобы курсор не прилипал к двоеточию.

Обработка прерывания (Ctrl+C)

Если пользователь нажмёт Ctrl+C, Python бросит KeyboardInterrupt:

try:
    name = input('Имя: ')
except KeyboardInterrupt:
    print('\nОтмена')
    name = None

Без перехвата программа завершится с трассировкой — для утилит командной строки это допустимо, для интерактивных скриптов — нет.

Чтение многострочного текста

Стандартная input() читает одну строку. Для многострочного ввода используют цикл с маркером завершения:

print('Введите текст (пустая строка — конец):')
lines = []
while True:
    line = input()
    if line == '':
        break
    lines.append(line)
text = '\n'.join(lines)

Пользователь набирает текст построчно. Пустая строка сигнализирует о завершении.

Работа с input() в автотестах

При написании тестов (pytest, unittest) вызывать input() вручную неудобно. Стандартный приём — подменить ввод через monkeypatch или mock:

# pytest
def test_greeting(monkeypatch):
    monkeypatch.setattr('builtins.input', lambda _: 'Алиса')
    assert greet() == 'Привет, Алиса!'

# unittest
from unittest.mock import patch


@patch('builtins.input', side_effect=['Алиса', '25', 'Москва'])
def test_registration(mock_input):
    result = register()
    assert result['name'] == 'Алиса'

Каждый вызов input() внутри register() получит следующий элемент списка side_effect.

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

  • Забывать о преобразовании типа. input() возвращает строку. Выражение input() + 1 вызовет TypeError.
  • Не обрабатывать ValueError. Пользователь может ввести что угодно — буквы, пустую строку, спецсимволы.
  • Использовать eval(input()). Это уязвимость, позволяющая выполнить произвольный код.
  • Не вызывать strip(). Пользователь случайно добавит пробел, и сравнение со строкой-образцом не сработает.
  • Не обрабатывать EOFError. При перенаправлении ввода файл может закончиться раньше, чем программа ожидает.

FAQ

Можно ли изменить разделитель вместо Enter?

Нет. input() всегда ждёт Enter. Для чтения отдельных клавиш используют модули msvcrt (Windows) или termios (Unix).

Как задать значение по умолчанию?

answer = input("Город [Москва]: ") or "Москва". Если пользователь нажмёт Enter, оператор or подставит "Москва".

input() работает только в консоли?

Да, input() привязана к stdin. В GUI (tkinter, PyQt) используют текстовые поля. В веб-приложениях — HTML-формы.

Как прочитать несколько строк?

Вызывать input() в цикле. Для чтения до конца файла — перехватывать EOFError или итерировать sys.stdin.

Читайте также