Возможности сервисов и приложений сильно возрастают, если они умеют общаться с пользователем, принимать информацию, обрабатывать и возвращать правильный ответ.
В Python для приёма информации от пользователя есть много вариантов, но мы сегодня расскажем про самый базовый — функцию-метод input()
.
Введение в функцию input()
В Python input()
нужен для общения с человеком в консоли через ввод данных с клавиатуры. Если пользователь, разработчик или тестировщик что-то печатают в веб-приложении или графическом интерфейсе GUI, там используются уже другие инструменты.
Input() будет хорошим решением, когда нужно добавить возможность взаимодействия без сложных новых форм и библиотек. Это не значит, что этой функцией-методом будут пользоваться только программисты. Обычные пользователи тоже вполне могут с ней работать, если понятно объяснить, что нужно сделать.
Вот пример в коде. Мы показываем пользователю подсказку и ждём, пока он даст нам нужные данные. После этого подтверждаем, что получили нужную информацию:
# печатаем подсказку и ждём ответ
city = input("Введите город доставки: ")
# используем введённое значение в тексте
print(f"Оформляем доставку в город: {city}")
Что увидит пользователь до ответа на запрос и после:
Введите город доставки: Ростов
Оформляем доставку в город: Ростов
В консоли можно даже делать небольшие игры. Так выглядит блек-джек:
Понятно, что для большой аудитории консоли недостаточно: лучше добавить графический интерфейс, бота в мессенджере или веб-приложение. Но возможность сделать простую программу с такими же возможностями в консоли с использованием input()
тоже есть.
Ещё это удобно для программистов. Например, вы сделали свою библиотеку и добавили функцию настроек через консоль. Тогда другие разработчики смогут пользоваться вашей библиотекой и быстро выбирать нужные опции или получать подсказки о том, что может делать ваш код, а что нет.
Полезный блок со скидкой
Если вам интересно разбираться со смартфонами, компьютерами и прочими гаджетами и вы хотите научиться создавать софт под них с нуля или тестировать то, что сделали другие, — держите промокод Практикума на любой платный курс: KOD (можно просто на него нажать). Он даст скидку при покупке и позволит сэкономить на обучении.
Бесплатные курсы в Практикуме тоже есть — по всем специальностям и направлениям, начать можно в любой момент, карту привязывать не нужно, если что.
Как работает функция input()
Функция даёт возможность пользователю дать информацию через консоль. Что будет после того, как пользователь введёт (или не введёт) какой-то ответ, должен предусмотреть разработчик. Дальше мы посмотрим на примерах, как это может работать.
Что такое input()?
Можно сказать, что input()
— точка остановки программы и ожидания ответа. Когда машина доходит до этой строки в коде, выполнение скрипта приостанавливается и компьютер ждёт ввода пользователя.
В скобках можно ввести параметр, который называется prompt
— это подсказка в кавычках. Но делать это необязательно, хотя в большинстве случаев желательно — иначе пользователь может даже не заметить, что программа остановилась и ждёт от него какой-то информации.
Чтобы код продолжил работу, нужно ввести ответ и нажать Enter — после этого программа прочтёт строку и сохранит её в ту же переменную, в которую мы предварительно присвоили input()
. Чтобы было понятнее, вот ещё один пример: в строке ниже мы объявляем переменную user
и просим ввести имя пользователя. После этого проверяем, что сохранилось в переменной и какой тип у этих данных:
# запрашиваем ответ от пользователя
# ответ сохранится в переменной user, в которую мы присвоили input
user = input("Введите имя пользователя: ")
# выводим на экран то, что сохранилось
print(f"Получено имя пользователя: {user}")
# проверям тип переменной
print(type(user))
При запуске получится примерно следующее:
Введите имя пользователя: Игорь
Получено имя пользователя: Игорь
<class ‘str’>
Обратите внимание, что ответ программа преобразовала в строку — это тип данных str
или string
. По умолчанию input()
преобразует все данные в строки, даже если ввести числа или булеву переменную типа True
или False
. Чтобы переделать их в нужный тип, это нужно предусмотреть в программе — мы покажем дальше, как именно.
Пример использования input()
Возьмём простой пример и посмотрим, как он будет выглядеть в реальной жизни. Заодно проверим, что ответ всегда сохраняется в формате строки:
# запрашиваем ответ от пользователя
raw = input("Введите что-нибудь: ")
# выводим на экран то, что сохранилось
print(f"Что сохранилось в переменной: {raw}")
# проверяем тип переменной
print("Тип сохранённых данных: ", type(raw))
Запускаем и попробуем ввести разные типы данных:
Что будет, если ничего не вводить
По умолчанию input()
останавливает выполнение кода до ответа пользователя.
Но если использовать дополнительные библиотеки, можно сделать так, чтобы программа ждала ответа определённое время, а потом возобновляла работу.
Пример — используя библиотеку inputimeout
, ждём ответа 10 секунд. После этого говорим, что время вышло, и даём команду продолжать выполнение:
# импортируем библиотеку и нужный модуль из неё
from inputimeout import inputimeout, TimeoutOccurred
# пробуем запустить код
try:
# ждём ввод 10 секунд
text = inputimeout(prompt="Введите что-нибудь. У вас есть 10 секунд: ", timeout=10)
# выводим на экран результат вывода
print(f"Вы ввели: {text}")
# если время вышло, выводим исключение
except TimeoutOccurred:
print("Время вышло! Продолжаем без ввода.")
# проверяем, что программа продолжает выполняться
print("Выполнение программы продолжается")
Проверяем, что через 10 секунд скрипт возобновляет работу:
Библиотека inputimeout
работает только с низкоуровневыми терминалами. Это значит, что запустить такую программу можно только в консольном приложении, таком как Terminal или iTerm на MacOS или CMD и PowerShell на Windows. Если попробовать запустить этот же код в IDE или через графический интерфейс, то получим ошибку.
Ввод строк
Строки — это тот формат, который функция создаёт по умолчанию после получения ответа от пользователя. Их не нужно дополнительно преобразовывать, можно сразу пользоваться.
В качестве данных эти строки могут использоваться для имён, адресов, комментариев.
answer = input(“Всё, что мы напишем здесь, сохранится в одну строку в переменной answer: “)
Ввод целых чисел
Ответ от пользователя можно обернуть в функцию int()
. Тогда при вводе целого числа оно сохранится как целое число, а не строка.
Как это выглядит в коде:
# просим ввести количество гостей
raw = input("Сколько гостей придёт? ")
# пытаемся преобразовать в целое число
number = int(raw)
# используем число в расчётах
print(f"Нужно заказать {number * 2} бутылок воды.")
Полученное число сразу можно использовать в расчётах:
Сколько гостей придёт? 15
Нужно заказать 30 бутылок воды.
Ввод чисел с плавающей точкой
Чтобы получить тип float
, нужно предусмотреть две вещи.
Во-первых, помнить, что в Питоне вместо запятой для разделения целой и дробной части используется точка. Если пользователь ввёл число с запятой, её нужно переделать в точку.
Во-вторых, после этого нужно создать новую строку, потому что изменять уже созданные строки в Python нельзя. Эту новую строку можно преобразовать в число с плавающей точкой через функцию float()
.
Пробуем:
# просим ввести температуру в градусах Цельсия
# все запятые сразу заменяем на точки
raw = input("Введите температуру, °C (например, 22.5): ").replace(",", ".")
# превращаем строку в число с плавающей точкой
temp_c = float(raw)
# переводим в Фаренгейты
print(f"Это {temp_c * 9/5 + 32:.1f} °F.")
Что получается при запуске:
Введите температуру, °C (например, 22.5): 33,9
Это 93.0 °F.
Ввод булевых значений
С переменными типа True
и False
придётся сделать немножко хитрее, потому что прямого преобразования в логические переменные в Python нет.
Для получения таких значений нужно предусмотреть словарь возможных вводов от пользователя. В словаре будут пары «ключ — значение». В качестве ключей мы используем строки, которые может ввести пользователь. В качестве значений — булевы переменные.
Теперь программа сможет попробовать понять ответ от человека:
# спрашиваем пользователя
answer = input("Продолжить выполнение программы? (y/n/да/нет): ").strip().casefold()
# готовим словарь допустимых ответов
mapping = {"y": True, "yes": True, "да": True, "n": False, "no": False, "нет": False}
# приводим ввод к булеву значению, по умолчанию False
using = mapping.get(answer, False)
# используем булево значение в условии
print("Продолжаем работу…" if using else "Закрываем программу.")
Проверим на нескольких значениях:
Ввод списка
Можно предусмотреть ввод сразу нескольких значений и объединить их в список. Для этого понадобятся генераторы списков — это функция, которая создаёт списки по указанному правилу.
В нашем примере мы попробуем получить несколько целых чисел и посчитать их среднее арифметическое. Для этого сначала разделим строку в местах, где пользователь поставит запятые. После этого удалим запятые и создадим список parts
, в котором будут строки из наших чисел.
Из списка строк мы сделаем новый список grades
, переводя каждое число типа string в настоящее число типа int
.
После этого список из чисел можно будет прочесть, сложить все его элементы и посчитать средний балл:
# просим ввести оценки через запятую
raw = input("Введите ваши оценки через запятую (например: 5,4,5): ")
# создаём генератор списка
# внутри него разбиваем строку на элементы и чистим пробелы
# получаем список строк
parts = [p.strip() for p in raw.split(",")]
# создаём генератор списка
# внутри превращаем каждую часть в целое число
grades = [int(p) for p in parts if p]
# считаем средний балл
print(f"Ваш средний балл: {sum(grades) / len(grades):.2f}")
Если запустить эту программу, получится так:
Введите ваши оценки через запятую (например: 5,4,5): 1, 2, 3, 4, 4, 5, 4
Ваш средний балл: 3.29
Обработка ошибок ввода
Пользователь может ввести не те данные или просто нажать Enter с пустым вводом. Это можно заранее предусмотреть и объяснить, какой нужен ответ.
Проверка пустого ввода
Сначала попробуем просто проверить, ввёл что-то пользователь или нет. Для этого очистим строку от пробелов и проверим, что в ней что-то осталось:
# просим ввести название проекта
project = input("Введите название проекта: ").strip()
# проверяем, что строка не пустая
if project:
print(f"Проект «{project}» создан.")
else:
print("Название пустое — проект не создан.")
Проверяем, что программа распознает пустой ввод:
Введите название проекта:
Название пустое — проект не создан.
Теперь введём что-нибудь при запуске:
Введите название проекта: Журнал КОД
Проект «Журнал КОД» создан.
Обработка исключений
Если в ответе нужен определённый тип данных, можно попробовать использовать конструкцию try-except
. Тогда, если преобразование из строки в число не удастся, программа выдаст ошибку — а мы заранее скажем, как на неё реагировать, чтобы можно было работать дальше.
Тут мы объясняем пользователю при ошибке, что нужно вводить:
# просим ввести процент скидки
function = input("Введите процент %: ")
# пытаемся преобразовать и сообщаем об ошибке
try:
discount = float(function.replace(",", "."))
print(f"Получено число: {discount}%")
except ValueError:
print("Нужно число, например 7.5")
Сначала попробуем правильный ввод:
Введите процент %: 13
Получено число: 13.0%
Теперь введём строку вместо числа:
Введите процент: %: тринадцать
Нужно число, например 7.5
Повторный ввод при ошибке
Предыдущая программа останавливалась при неправильном вводе, и для повторного ответа её придётся запустить снова. Можно сделать проще и сразу запускать скрипт, если ввод не подходит и нужно попробовать ещё раз:
# создаём бесконечный цикл до корректного ввода
while True:
# сначала спрашиваем количество билетов
raw = input("Сколько билетов вам нужно? ")
try:
# пытаемся преобразовать
tickets = int(raw)
# проверяем дополнительное условие
if tickets <= 0:
print("Нужно положительное число.")
# продолжаем спрашивать
continue
# прерываем цикл при правильном вводе
break
# сообщаем о неправильном формате при ошибке
except ValueError:
print("Введите целое число, например 3.")
# используем итоговое значение
print(f"Бронируем {tickets} билета(-ов).")
Мы используем ту же конструкцию try-except
, но при получении ошибки сразу запускаем этот фрагмент скрипта повторно.
Проверяем, что при неправильных вводах мы получаем подсказку и можем снова попытаться передать нужные данные:
Сколько билетов вам нужно? три
Введите целое число, например 3.
Сколько билетов вам нужно? -1
Нужно положительное число.
Сколько билетов вам нужно? 3
Бронируем 3 билета(-ов).
Многострочный ввод
С помощью циклов можно предусмотреть повторный ввод не только при ошибке, но и если нужно получить сразу несколько значений.
Для этого сохраняем каждый ответ в список, а потом объединяем ответы в строку через метод .join()
. В скобках нужно передать список, а перед точкой — разделитель для элементов. Тут мы используем точку с запятой:
# сообщаем правила ввода
print("Введите пункты списка. Ввод закончится, если ввести пустую строку.")
# готовим список для строк
enter = []
# читаем до пустой строки
while True:
# читаем очередную строку
line = input("Введите пункт: ")
# если строка пустая — выходим
if not line.strip():
break
# сохраняем пункт
enter.append(line.strip())
# печатаем результат
print("Ваш список:", "; ".join(enter))
Запускаем код и вводим несколько значений:
Введите пункт: один
Введите пункт: два
Введите пункт: три
Введите пункт:
Ваш список: один; два; три
Практические примеры использования функции input()
Вот два примера, как может использоваться функция ввода.
Пример: Калькулятор
Калькулятор для простых операций с двумя числами работает так:
- Мы спрашиваем у пользователя первое число, заменяем возможные запятые на точки и преобразовываем в число с плавающей точкой.
- Узнаём нужную математическую операцию и сохраняем введённый математический оператор как строку.
- Просим ввести второе число и сохраняем как число с плавающей точкой — так же, как первое.
- Делаем простую проверку на 4 операции и, если ввод пользователя совпадает с одной из них, выполняем.
- Если пользователь ввёл какую-то другую команду, останавливаем программу.
# читаем первое число
first_num = float(input("Первое число: ").replace(",", "."))
# читаем операцию
operation = input("Операция (+, -, *, /): ").strip()
# читаем второе число
second_num = float(input("Второе число: ").replace(",", "."))
# выполняем выбранную операцию
if operation == "+":
print(f"= {first_num + second_num}")
elif operation == "-":
print(f"= {first_num - second_num}")
elif operation == "*":
print(f"= {first_num * second_num}")
elif operation == "/":
# проверяем деление на ноль
print("= бесконечность" if second_num == 0 else f"= {first_num / second_num}")
else:
print("Неизвестная операция")
Попробуем посчитать:
Первое число: 13.9
Операция (+, -, *, /): /
Второе число: 61.3
= 0.2267536704730832
Пример: Проверка возраста
Проверка возраста будет работать так же, как обычная проверка на тип данных. Нужно проверить, что в качестве ввода получили целое положительное число и что оно больше определённого значения.
При ошибке выводим подсказку, при неподходящем возрасте — результат проверки:
# пытаемся безопасно получить возраст
while True:
# просим ввести возраст
raw = input("Ваш возраст: ").strip()
try:
# преобразуем в целое
age = int(raw)
# проверяем корректность
if age < 0:
print("Возраст не может быть отрицательным.")
continue
# выходим из цикла при успехе
break
except ValueError:
# просим ввести ещё раз
print("Введите целое число, например 18.")
# принимаем решение
if age >= 18:
print("Доступ разрешён.")
else:
print("Доступ запрещён.")
Запускаем и смотрим на результаты в терминале:
Ваш возраст: двадцать
Введите целое число, например 18.
Ваш возраст: -20
Возраст не может быть отрицательным.
Ваш возраст: 20
Доступ разрешён.
Сравнение input() и raw_input()
В Python 2 были две функции: raw_input()
и input()
.
Raw_input()
всегда возвращала строку, а пыталась вычислить введённое выражение. Это было небезопасно, потому что такие решения работают по-разному на разных системах и могут приводить к ошибкам.
В Python 3 оставили только безопасное поведение: сейчас input()
всегда возвращает строку, а raw_input()
удалили совсем. Поэтому, если вы видите примеры с raw_input()
, в современном Питоне их нужно заменить на обычный input()
.
Вам слово
Приходите к нам в соцсети поделиться своим мнением о способах ввода в Python и почитать, что пишут другие. А ещё там выходит дополнительный контент, которого нет на сайте — шпаргалки, опросы и разная дурка. В общем, вот тележка, вот ВК — велком!