До сих пор все данные в программе вы задавали сами: писали числа и строки прямо в коде. Но по-настоящему полезная программа так не работает — она должна уметь спросить у человека, чего он хочет, и подстроиться под ответ. Калькулятор должен узнать, какие числа считать, а не иметь их зашитыми заранее. Для этого Python умеет получать данные во время работы программы — и в этом уроке вы разберётесь, как это устроено и почему тут есть одна ловушка, на которой спотыкаются почти все новички.
Видео-урок
Функция input() — как программа слушает пользователя
Представьте кассира, который на секунду замолкает и ждёт, что вы назовёте нужный товар, прежде чем продолжить. Программа умеет делать то же самое: остановиться, подождать, пока человек что-то напечатает и нажмёт Enter, и только потом идти дальше. Именно за это отвечает готовая функция input(): она ставит программу на паузу, показывает курсор в консоли и ждёт ответа.
Официально это называется вводом данных (input), а результат работы input() — это то, что функция возвращает, то есть отдаёт обратно в программу, чтобы вы могли сохранить это в переменную. Вызов простой — пустые скобки, без параметров:
name = input()
print("Привет,", name)Разберём по шагам, что здесь произошло:
input()— программа останавливается и ждёт, пока пользователь что-то напечатает и нажмёт Enter.name = ...— то, что человек напечатал, сохраняется в переменнуюname(как обычное присваивание, которое вы уже знаете).print("Привет,", name)— вызов уже знакомой функцииprint()с двумя аргументами через запятую: текстом и переменной.
Если пользователь напечатал Анна и нажал Enter, переменная name получит значение "Анна", и на экране появится строка Привет, Анна.
Проблема у этого варианта одна: человек видит пустой экран и не понимает, чего от него хотят. Поэтому у input() есть необязательный параметр — текст-подсказка, который печатается перед вводом:
name = input("Как вас зовут? ")
print("Привет,", name)Разбор:
"Как вас зовут? "— строка-аргумент внутриinput(). Она печатается в консоли, и курсор для ввода появляется сразу после неё.- Пробел перед закрывающей кавычкой сделан специально: без него подсказка и ответ пользователя слипнутся в одну строку —
Как вас зовут?Анна. С пробелом получится аккуратно:Как вас зовут? Анна.
Что бы человек ни напечатал — число, дату, слово «да» — input() отдаёт это программе как текст, то есть значение типа str. Даже если пользователь ввёл 42, для Python это не число сорок два, а строка из двух символов: "4" и "2". Так сделано специально: Python не может угадать, хотите вы посчитать введённое как число или использовать как текст, поэтому решение всегда остаётся за вами.
Посмотрим, к чему приводит забытое правило. Программа просит два числа и складывает их:
a = input("Введите число: ") # пользователь вводит 5
b = input("Ещё одно: ") # пользователь вводит 3
print(a + b) # ждём 8, получаем 53Разбор:
a = input(...)иb = input(...)— обе переменные получают строки"5"и"3", а не числа.a + b— для строк оператор+означает не сложение, а склейку (конкатенацию): он ставит один текст сразу после другого. Строка"5"плюс строка"3"даёт строку"53".
Преобразование типов: int(), float(), str(), bool()
Раз input() всегда отдаёт текст, а считать вы хотите числа, нужен способ «перевести» одно в другое. Это как обменник валюты: у вас на руках строка, а нужны рубли-числа, и обменник — это отдельная функция, которая берёт значение одного вида и выдаёт значение другого.
Официально это называется преобразованием типов (type conversion). В Python для этого есть несколько готовых функций, и с каждой из них вы уже сталкивались через type() из прошлого урока — это как раз названия типов, которые type() показывает:
int() | превращает в целое число. Дробную часть отбрасывает, а не округляет: int("42") → 42, int(3.9) → 3. |
float() | превращает в дробное число: float("3.14") → 3.14, float(5) → 5.0. |
str() | превращает в строку: str(42) → "42", str(3.14) → "3.14". |
bool() | превращает в истину или ложь: bool(0) → False, любое непустое или ненулевое значение → True. |
Исправим сложение из прошлого примера, обернув каждый input() в int():
a = int(input("Введите число: ")) # "5" -> 5
b = int(input("Ещё одно: ")) # "3" -> 3
print(a + b) # 5 + 3 = 8Разбор:
int(input("Введите число: "))— здесь одна функция вызвана внутри другой. Python выполняет их изнутри наружу: сначала срабатываетinput(...)и возвращает строку, например"5", а затем эта строка сразу передаётся вint(), которая превращает её в число5.- Результат сохраняется в переменную
a— и теперь это уже целое число, а не текст. a + b— раз обе переменные числа,+снова означает сложение, а не склейку: получится8.
Если в числе нужна дробная часть — например, цена товара — int() не подойдёт: он не умеет читать точку. Для этого есть float():
price = float(input("Введите цену: ")) # например 199.99
tax = 0.12
total = price * (1 + tax)
print("Итого с налогом:", total)Разбор:
float(input(...))— та же схема, что и сint(), только строка превращается в дробное число, поэтому точка в вводе199.99не ломает преобразование.tax = 0.12— обычная дробная переменная, заданная прямо в коде.total = price * (1 + tax)— арифметика с дробными числами работает так же, как с целыми: умножение через*, скобки задают порядок действий.
str() нужен в обратную сторону: когда число нужно склеить с текстом через +, ведь + для строки и числа одновременно Python не понимает:
age = 25
# print("Мне " + age + " лет") # ошибка: нельзя склеить str и int
print("Мне " + str(age) + " лет") # верно: "Мне 25 лет"Разбор:
- Закомментированная строка (после
#) не выполняется — она оставлена как пример того, что НЕ сработает: Python не может склеить строку и число оператором+напрямую. str(age)превращает число25в строку"25", и теперь+склеивает три строки подряд:"Мне ","25"и" лет".
На практике для такой склейки чаще удобнее запятая внутри print() (как в первых примерах урока) или f-строки, с которыми вы уже работали.
bool() нужен реже всего, но его логику важно понимать: пустое или нулевое значение превращается в False, всё остальное — в True:
print(bool(0)) # False -- ноль считается "пустым"
print(bool(42)) # True -- любое ненулевое число
print(bool("")) # False -- пустая строка
print(bool("текст")) # True -- непустая строкаРазбор построчно: bool(0) и bool("") дают False, потому что ноль и пустая строка — единственные по-настоящему «пустые» значения среди чисел и строк. Любое другое число (даже отрицательное) и любая непустая строка (даже "0" как текст) превращаются в True.
Если попытаться выполнить int("привет"), Python не сможет найти в этом тексте число и выбросит ошибку ValueError — это значит «неверное значение»: функция получила данные не того вида, с которым умеет работать. Обрабатывать такие ошибки, чтобы программа не останавливалась, вы научитесь позже; пока считаем, что пользователь вводит именно то, что просят.
Как ввод работает в задачах на платформе
Когда вы решаете задачу здесь, на sudoteach.com, рядом с вашим кодом нет живого человека за клавиатурой. Вместо этого при проверке заранее подготовлены значения, которые как будто вводит «виртуальный пользователь» — ровно столько, сколько ваша программа попросит через input(), и в том порядке, в котором вы их запрашиваете.
Если задача обещает, что в программу вводят два числа, а ваш код вызывает input() три раза — на третий раз брать значение будет неоткуда. В таком случае проверка останавливается с ошибкой, в которой встречается фраза EOF when reading a line (EOF значит «end of file», конец данных: подготовленные ответы закончились, а программа продолжает их просить).
Эта ошибка почти всегда говорит не о вводе как таковом, а о том, что в коде лишний вызов input() — например, вы случайно спросили имя дважды, или запросили число, хотя по условию задачи его нужно было сразу вычислить. Если видите EOF when reading a line — пересчитайте, сколько раз в коде встречается input(), и сверьте с условием задачи.
Частые ошибки
Соберём вместе ловушки, на которых чаще всего спотыкаются в теме ввода и типов — чтобы вы их узнали сразу, если встретите.
a = input("Число: "), а дальше a + 10 — упадёт с ошибкой: строку и число складывать напрямую нельзя. Решение: a = int(input("Число: ")) сразу при вводе.
int(3.9) даёт 3, а не 4. Если нужно именно округление до ближайшего целого, потребуется функция round(), с которой вы уже знакомы, — int() для этого не подходит.
int("пять") ломает программу, потому что int() понимает только цифры (и, отдельно, знак минуса). Слово «пять» для него не число, даже если человек его так прочитал.
Количество вызовов input() в коде должно точно совпадать с тем, сколько значений обещает условие задачи — иначе на платформе это и даёт ошибку EOF when reading a line, о которой говорили выше.
Что важно запомнить
input("Ваш возраст: ") объясняет человеку, чего от него ждут.int(input("...")) или float(input("...")).round().Проверьте себя
3 вопроса
Преобразование строк в числа
Даны две строковые переменные a_str = "15" и b_str = "7". Преобразуйте их в целые числа (сохраните в переменные a и b), сложите и выведите результат через print(). Например, если бы значения были "10" и "2", программа должна была бы напечатать 12.
Проверка истинности
Даны переменные: val = 0 и text = "Python". Преобразуйте каждую в булев тип с помощью bool(), сохраните результаты в переменные val_bool и text_bool и выведите оба через print() -- сначала val_bool, потом text_bool.