Ввод/вывод: консоль, форматы, обработка ошибок ввода🔗
Потоки данных: stdin, stdout и stderr🔗
Представьте программу как кухню, а консоль — как терминал заказов. Стандартные потоки данных определяют, как информация пересекает границу между поваром и внешним миром.
stdin (standard input) — чек от официанта с заказом клиента. Это поток данных, идущий от пользователя к программе. В Python чтение из stdin выполняет функция input().
stdout (standard output) — готовое блюдо на выдаче. Сюда программа направляет результаты работы через функцию print().
stderr (standard error) — отдельный канал для срочных сообщений о проблемах: недостающих ингредиентах или сбоях оборудования. В отличие от stdout, этот поток предназначен только для диагностики и не смешивается с основным результатом.
На практике консоль выступает текстовым интерфейсом, где эти потоки встречаются. Функции print() и input() — высокоуровневые обертки, упрощающие работу с низкоуровневыми каналами данных.
Диаграмма загружается…
Далее рассмотрим параметризацию вывода и обработку ошибок ввода.
Базовый вывод: параметризация print()🔗
Если stdout — это подача готового блюда на выдачу, то print() — это тарелка, на которой повар её выкладывает. По умолчанию Python автоматически ставит между ингредиентами пробел и переводит строку после каждого вывода. Но иногда нужно изменить форматирование под конкретную задачу.
Параметр sep (separator) задаёт строку-разделитель между значениями. Вместо стандартного пробела можно использовать вертикальную черту, запятую или табуляцию для создания табличного вида:
dish = "Паста"
price = 350
print(dish, price, sep=" | ")
А за окончание строки отвечает параметр end. По умолчанию это \n (перевод строки), но можно заменить на пустую строку или пробел для создания эффекта «в одну линию» — например, при реализации индикатора загрузки или псевдографики:
print("[", end="")
print("====", end="")
print("]", end="")
| Параметр |
Значение по умолчанию |
Эффект |
sep |
" " (пробел) |
Разделитель между аргументами функции |
end |
"\n" (перевод строки) |
Символ, добавляемый в конце вывода |
Здесь мы используем только базовую конкатенацию через запятую. Форматирование чисел, методы строк и f-strings — тема девятой лекции, а управление шириной полей через .format() оставим за рамками базового курса.
Если stdin — это чек от клиента, то input() — момент, когда кухня принимает заказ. Функция всегда возвращает строку (str), даже если пользователь ввёл число.
temp = input("Температура духовки: ")
print(type(temp)) # <class 'str'>
Для вычислений этого недостаточно — строку нужно превратить в число.
Конвертация значений: int() и float()🔗
Используем конструкторы для преобразования:
portions = int(input("Количество порций: "))
total_flour = portions * 250 # г муки на порцию
print("Нужно", total_flour, "грамм муки")
Для дробных величин подойдёт float():
celsius = float(input("Температура по Цельсию: "))
fahrenheit = celsius * 9/5 + 32
print(fahrenheit, "°F")
Риск брака: что, если ввести «abc»?🔗
Если пользователь введёт текст вместо числа, вызов int("abc") вызовет ошибку и программа аварийно завершится. Это как попытаться нарезать буквы вместо овощей.
В следующем разделе научимся проверять входные данные перед обработкой и отлавливать ошибки до начала работы.
Защита от 'испорченных ингредиентов': обработка ошибок ввода🔗
Принимая заказ через input(), кухня всегда рискует получить данные в неправильном формате. Если клиент введёт «пять» вместо 5 или оставит поле пустым, попытка явного преобразования int() или float() вызовет ошибку времени выполнения — ValueError. Программа аварийно завершится, как будто повар обнаружил протухшие яйца только после начала замеса теста.
# Пользователь вводит: двести
temperature = int(input("Температура духовки: "))
# ValueError: invalid literal for int() with base 10: 'двести'
До знакомства с полноценной валидацией единственная защита — чёткая инструкция в приглашении ввода. Надёжная проверка требует двух продвинутых техник из следующих лекций:
- Циклы (
while, лекция 5) — для повторного запроса данных до успешного преобразования;
- Обработка исключений (конструкция
try-except, лекция по отладке) — чтобы перехватить ValueError, не останавливая работу всей кухни.
Диаграмма загружается…
Пока вы не освоите эти инструменты, тестируйте рецепты только на «свежих», корректных данных. Некорректные значения прервут выполнение до готового результата.