Применение input в скриптах на Python: варианты и примеры

Раздел: Ввод-вывод -> Примеры использования

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

Основные варианты использования input

Наиболее эффективное решение - создание универсальной функции, которая запрашивает ввод, преобразует его в нужный тип и повторяет запрос при ошибке. Такой подход подходит для большинства консольных программ.


def get_input(prompt, type_func=str, error_msg="Неверный формат. Повторите ввод."):
    while True:
        try:
            raw = input(prompt)
            return type_func(raw)
        except ValueError:
            print(error_msg)

# Пример: ввод целого числа
age = get_input("Введите возраст: ", int)
print(f"Возраст: {age}")
  

Python input варианты (варианты использования input в python)

Функция принимает приглашение, функцию преобразования (по умолчанию str) и сообщение об ошибке. В случае ValueError цикл повторяется. Это избавляет от дублирования кода и упрощает обработку разных типов.

Возможные проблемы и ошибки:

  • Бесконечный цикл, если пользователь всегда вводит некорректные данные. Рекомендуется добавить счётчик попыток или возможность выхода через пустую строку.
  • Игнорирование KeyboardInterrupt (Ctrl+C). По умолчанию исключение прерывает программу, что часто корректно.
  • Преобразование типов, не входящих в ValueError (например, переполнение для int). В Python 3 целые числа не ограничены, поэтому переполнение не возникает.

Как просто получить строку от пользователя без преобразования?

Самый простой вариант - вызвать input() без дополнительной обработки. Результат всегда является строкой.


name = input("Ваше имя: ")
print(f"Привет, {name}!")
  

Типичная ошибка: ожидание числа, но получение строки. Например, попытка сложить строки вместо чисел. Решение - явное преобразование с проверкой.

Как ввести целое число с проверкой на ошибки?

Для ввода целого числа применяется int() в блоке try-except. Это защищает от ввода букв или дробных чисел.


while True:
    try:
        number = int(input("Введите целое число: "))
        break
    except ValueError:
        print("Ошибка: требуется целое число.")
print(f"Вы ввели {number}")
  

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

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

Используется метод split() для разделения строки и map() для преобразования каждого элемента.


raw = input("Введите числа через пробел: ")
try:
    numbers = list(map(int, raw.split()))
    print(f"Список чисел: {numbers}")
except ValueError:
    print("Ошибка: все элементы должны быть целыми числами.")
  

Ошибка: лишние пробелы или пустые строки - split() их игнорирует, если не указан разделитель. Однако если введено только пустое пространство, split() вернёт пустой список, что может быть нежелательно.

Как вводить данные до определённого условия (например, пустая строка)?

Цикл while с проверкой на пустой ввод или заданный маркер.


lines = []
while True:
    line = input("Введите строку (пустая для завершения): ")
    if line == "":
        break
    lines.append(line)
print("Введённые строки:", lines)
  

Проблема: если требуется обработать пустую строку как допустимое значение, следует выбрать другой маркер, например "q" или "exit".

Как скрыть вводимый текст (например, пароль)?

Модуль getpass предоставляет функцию getpass(), которая не отображает вводимые символы.


from getpass import getpass
password = getpass("Введите пароль: ")
print("Пароль принят.")
  

Ошибка: функция getpass() не работает в некоторых IDE (например, PyCharm) из-за отсутствия настоящего терминала. В таких случаях можно использовать стандартный input() с предупреждением.

Как получить аргументы командной строки вместо интерактивного ввода?

Модуль argparse позволяет задавать аргументы при запуске скрипта. Это удобно для автоматизации.


import argparse

parser = argparse.ArgumentParser(description="Пример обработки аргументов")
parser.add_argument("--name", required=True, help="Имя пользователя")
parser.add_argument("--age", type=int, help="Возраст")
args = parser.parse_args()

print(f"Имя: {args.name}")
if args.age:
    print(f"Возраст: {args.age}")
  

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

Как ограничить время на ввод?

С помощью сигналов (signal) можно установить таймер, по истечении которого ввод будет прерван. Подходит для Unix-подобных систем.


import signal

def timeout_handler(signum, frame):
    raise TimeoutError("Время истекло")

signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(5)  # 5 секунд

try:
    answer = input("Введите ответ за 5 секунд: ")
    signal.alarm(0)  # сброс таймера
    print(f"Ответ: {answer}")
except TimeoutError:
    print("\nВремя вышло.")
  

Ограничения: сигналы не работают в Windows. Для кроссплатформенного решения лучше использовать потоки с таймером (но это сложнее).

Расширенные примеры использования input

Ввод с автодополнением и историей (модуль readline)

Модуль readline добавляет возможность автодополнения по Tab и навигацию по истории. Пример для ввода команд:

Пример

import readline

commands = ['help', 'exit', 'version', 'status']

def completer(text, state):
    matches = [cmd for cmd in commands if cmd.startswith(text)]
    if state < len(matches):
        return matches[state]
    return None

readline.set_completer(completer)
readline.parse_and_bind('tab: complete')

while True:
    cmd = input("Введите команду: ")
    if cmd == 'exit':
        break
    print(f"Выполняется: {cmd}")
Введите команду: he[Tab]  -> help
Введите команду: help
Выполняется: help
Введите команду: exit

Чтение большого объёма данных из stdin (перенаправление)

Если данные передаются через конвейер (pipe) или перенаправление файла, удобно читать из sys.stdin построчно.

Пример

import sys

print("Чтение данных из stdin (Ctrl+D для завершения):")
try:
    for line in sys.stdin:
        # Удаляем символ новой строки и обрабатываем
        line = line.rstrip('\n')
        if line:
            print(f"Принято: {line}")
except KeyboardInterrupt:
    print("\nВвод прерван.")
$ echo -e "строка1\nстрока2" | python script.py
Чтение данных из stdin (Ctrl+D для завершения):
Принято: строка1
Принято: строка2

Ввод пароля с подтверждением (два раза)

Для надёжности пароль вводится дважды и сравнивается. Используется getpass.

Пример

from getpass import getpass

while True:
    pwd1 = getpass("Введите пароль: ")
    pwd2 = getpass("Повторите пароль: ")
    if pwd1 == pwd2:
        print("Пароль установлен.")
        break
    else:
        print("Пароли не совпадают. Попробуйте снова.")
Введите пароль:
Повторите пароль:
Пароль установлен.

Интерактивное меню с выбором опций

Используется бесконечный цикл с проверкой ввода. Каждая опция - вызов функции.

Пример

def option1():
    print("Выбрана опция 1")

def option2():
    print("Выбрана опция 2")

def option3():
    print("Выбрана опция 3")

options = {
    '1': option1,
    '2': option2,
    '3': option3
}

while True:
    print("\nМеню:")
    print("1. Опция 1")
    print("2. Опция 2")
    print("3. Опция 3")
    print("0. Выход")
    choice = input("Введите номер: ").strip()
    if choice == '0':
        break
    func = options.get(choice)
    if func:
        func()
    else:
        print("Неверный ввод, попробуйте снова.")
Меню:
1. Опция 1
2. Опция 2
3. Опция 3
0. Выход
Введите номер: 2
Выбрана опция 2
...

Ввод данных с регулярными выражениями (валидация)

Можно комбинировать input() с проверкой по шаблону, например для email.

Пример

import re

pattern = r'^[\w\.-]+@[\w\.-]+\.\w+$'

while True:
    email = input("Введите email: ")
    if re.match(pattern, email):
        print("Email корректен.")
        break
    else:
        print("Неверный формат email. Попробуйте снова.")
Введите email: test@example
Неверный формат email. Попробуйте снова.
Введите email: user@domain.com
Email корректен.

Варианты использования input в Python - comments

En
Python input варианты (python)