Пользовательский ввод в 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!Два момента, на которые стоит обратить внимание:
- Строка подсказки выводится в терминал без символа новой строки — курсор остаётся сразу после
?. - Возвращаемое значение всегда является
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 : 30Python 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-строк