W3docs

Пользовательский ввод в Python

Как читать пользовательский ввод в Python с помощью input(), преобразовывать типы, проверять данные, обрабатывать ошибки и строить интерактивные программы.

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

Что вы узнаете:

  • Как работает input() и что она всегда возвращает
  • Преобразование string-ввода в числа и другие типы
  • Запрос нескольких значений в одной строке
  • Валидация ввода с помощью циклов и try/except
  • Чтение паролей без отображения символов
  • Распространённые ошибки и способы их избежать

Функция input()

input() выводит необязательную подсказку, ожидает нажатия пользователем Enter и возвращает всё введённое им в виде string.

name = input("What is your name? ")
print("Hello, " + name + "!")

Пример сеанса:

What is your name? Alice
Hello, Alice!

Два момента, на которые стоит обратить внимание:

  1. Строка подсказки выводится в терминал без символа новой строки — курсор остаётся сразу после ?.
  2. Возвращаемое значение всегда является str, даже если пользователь ввёл 42.

Если вызвать input() без аргументов, подсказка не будет показана, но функция всё равно будет ожидать ввода:

value = input()  # silent prompt

Преобразование ввода в другие типы

Поскольку input() всегда возвращает string, необходимо привести значение к нужному типу, если требуется число или что-то иное. Встроенные функции преобразования Python делают это простым.

Ввод целого числа

age = int(input("Enter your age: "))
print("In ten years you will be", age + 10)
Enter your age: 25
In ten years you will be 35

Ввод числа с плавающей точкой

price = float(input("Enter the price: "))
tax = price * 0.08
print(f"Tax: ${tax:.2f}")
Enter the price: 19.99
Tax: $1.60

Ввод в стиле boolean

В Python нет быстрого способа преобразовать текст «да/нет» через bool(), поэтому проверяйте string напрямую:

answer = input("Continue? (yes/no): ").strip().lower()
if answer == "yes":
    print("Continuing...")
else:
    print("Stopping.")

Полный справочник по системе типов Python смотрите в главах Python Data Types и Python Casting.


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

Иногда пользователю нужно ввести несколько значений в одной строке. Метод str.split() разбивает введённую string на список.

# Read three space-separated integers
a, b, c = input("Enter three numbers separated by spaces: ").split()
a, b, c = int(a), int(b), int(c)
print("Sum:", a + b + c)
Enter three numbers separated by spaces: 4 7 2
Sum: 13

Можно также использовать произвольный разделитель:

first, last = input("Enter your full name (first,last): ").split(",")
print(f"Hello, {first.strip()} {last.strip()}!")
Enter your full name (first,last): Alice,Smith
Hello, Alice Smith!

map() — лаконичный способ преобразовать все части сразу:

numbers = list(map(int, input("Enter numbers: ").split()))
print("Numbers:", numbers)
print("Total:", sum(numbers))
Enter numbers: 3 1 4 1 5 9
Numbers: [3, 1, 4, 1, 5, 9]
Total: 23

Обработка некорректного ввода с помощью try/except

Если пользователь введёт что-то неожиданное — буквы вместо числа — преобразование вызовет ValueError и программа аварийно завершится, если исключение не перехватить.

Базовая обработка ошибок

try:
    age = int(input("Enter your age: "))
    print("Valid age:", age)
except ValueError:
    print("That is not a valid number. Please enter digits only.")
Enter your age: twenty
That is not a valid number. Please enter digits only.

Полное руководство по обработке исключений смотрите в главе Python Try Except.

Повторный запрос до получения корректного ввода

Цикл while True в сочетании с break — стандартный паттерн «продолжать спрашивать, пока пользователь не введёт правильное значение»:

while True:
    try:
        age = int(input("Enter your age: "))
        if age < 0 or age > 130:
            print("Please enter a realistic age (0-130).")
        else:
            break  # valid input received
    except ValueError:
        print("That is not a valid number. Please try again.")

print(f"Your age is {age}.")

Пример сеанса:

Enter your age: abc
That is not a valid number. Please try again.
Enter your age: -5
Please enter a realistic age (0-130).
Enter your age: 28
Your age is 28.

Этот паттерн — цикл, try/except, проверка диапазона, break — охватывает подавляющее большинство реальных задач валидации ввода.

Подробнее об управлении циклами смотрите в главе Python While Loops.


Удаление пробелов

Пользователи нередко случайно добавляют пробел в начале или конце строки. Всегда вызывайте .strip() для текстового ввода перед сравнением или сохранением:

username = input("Username: ").strip()
if username == "admin":
    print("Welcome, administrator!")
else:
    print(f"Welcome, {username}!")

.lower() или .upper() помогает при сравнениях без учёта регистра:

city = input("Enter your city: ").strip().lower()
if city == "new york":
    print("You are in the Big Apple!")

Валидация ввода с условиями

Для проверки вариантов или шаблонов проверяйте значение напрямую после удаления пробелов и нормализации:

color = input("Choose a color (red/green/blue): ").strip().lower()
valid_colors = {"red", "green", "blue"}

if color not in valid_colors:
    print(f"'{color}' is not a valid choice. Pick red, green, or blue.")
else:
    print(f"You chose {color}.")

Валидация с помощью регулярных выражений

Модуль re позволяет проверить, соответствует ли ввод определённому шаблону:

import re

email_pattern = r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$"

email = input("Enter your email address: ").strip()
if re.match(email_pattern, email):
    print("Valid email address.")
else:
    print("Invalid email address. Please include '@' and a domain.")
Enter your email address: [email protected]
Valid email address.

Примечание: Приведённое регулярное выражение упрощено в демонстрационных целях. В производственных системах для проверки адресов электронной почты обычно используют специализированную библиотеку (например, email-validator) или серверную валидацию.


Безопасное чтение паролей

Стандартная функция input() отображает символы в терминале по мере ввода. Для паролей и других секретных данных используйте getpass.getpass() из стандартной библиотеки — она скрывает вводимые символы:

import getpass

password = getpass.getpass("Enter your password: ")
print("Password received (length:", len(password), "characters).")

getpass.getpass() принимает такой же необязательный аргумент-подсказку, что и input(). Терминал подавляет отображение символов; возвращаемое значение является обычной string.


Форматированный вывод на основе ввода

Когда данные от пользователя получены, f-строки Python позволяют легко представить их в понятном виде. Подробности смотрите в главе Format Strings.

name = input("Name: ").strip().title()
birth_year = int(input("Birth year: "))
current_year = 2025
age = current_year - birth_year

print(f"\n--- Profile ---")
print(f"Name      : {name}")
print(f"Born      : {birth_year}")
print(f"Age       : {age}")
Name: alice smith
Birth year: 1995

--- Profile ---
Name      : Alice Smith
Born      : 1995
Age       : 30

Python 2 и Python 3

Если вы встречаете старый код на Python 2, имейте в виду, что аналогичная функция называлась raw_input(). В Python 2 функция input() вычисляла введённое пользователем выражение (аналогично eval()), что являлось угрозой безопасности. В Python 3 input() всегда возвращает обычную string, а raw_input() больше не существует.

# Python 2 (legacy — do not use)
# name = raw_input("Your name: ")

# Python 3 (correct)
name = input("Your name: ")

Распространённые ошибки

ОшибкаЧто происходитИсправление
age = int(input(...)) без try/exceptАварийное завершение при нечисловом вводеОбернуть в try/except ValueError
Забыть .strip()" admin" не равно "admin"Всегда удалять пробелы из текстового ввода
Сравнивать сырой ввод с числомinput() == 5 всегда FalseСначала преобразовать: int(input(...)) == 5
Использовать input() для паролейСимволы видны на экранеИспользовать getpass.getpass()
Ожидать, что bool(input(...)) сработаетЛюбая непустая string является истиннойРазобрать string: == "yes"

Краткий справочник

# String input
name = input("Name: ").strip()

# Integer input with validation
while True:
    try:
        n = int(input("Enter a number: "))
        break
    except ValueError:
        print("Integers only, please.")

# Float input
price = float(input("Price: "))

# Multiple values on one line
x, y = map(int, input("Enter x y: ").split())

# Password (hidden input)
import getpass
pwd = getpass.getpass("Password: ")

# Choice validation
choice = input("(yes/no): ").strip().lower()
if choice not in ("yes", "no"):
    print("Please type yes or no.")

Связанные темы

  • Python Variables — хранение и именование значений
  • Python Data Types — string, целые числа, числа с плавающей точкой и другие типы
  • Python Casting — преобразование между типами
  • Python Strings — методы .strip(), .lower(), .split()
  • Python Try Except — перехват и обработка исключений
  • Python While Loops — повторение до выполнения условия
  • Format Strings — создание строк вывода с помощью f-строк

Практика

Практика
Which of the following are valid ways to get user input in Python?
Which of the following are valid ways to get user input in Python?
Was this page helpful?