Ввод через пробел в Python: split, числа и ошибки
В Python input() возвращает строку без завершающего перевода строки. Чтобы получить отдельные значения, вызовите split(), а затем явно преобразуйте нужные элементы в числа. Разделение строки само по себе не проверяет её смысл.
Содержание статьи
Что именно считает разделителем split
text = " 12 7\t-3 "
print(text.split())
# ['12', '7', '-3']
print("a b".split(" "))
# ['a', '', 'b']Без аргумента split() объединяет серии пробельных символов, включая табуляцию, и убирает пустые элементы по краям. При явном разделителе " " два соседних пробела создают пустую строку. Для обычного ввода чисел первый вариант удобнее.
Завершённый пример: ровно три целых числа
def read_three_integers(line):
tokens = line.split()
if len(tokens) != 3:
raise ValueError("Нужно ровно три целых числа")
try:
return [int(token) for token in tokens]
except ValueError as exc:
raise ValueError("Допустимы только целые числа") from exc
try:
values = read_three_integers(input("Три числа: "))
except (ValueError, EOFError) as exc:
print("Ввод не принят:", exc)
else:
print("Сумма:", sum(values))Для строки 12 7 -3 получится список [12, 7, -3] и сумма 16. Пустая строка, две величины или 1 2.5 3 не проходят проверку. EOFError означает, что источник ввода закончился, а не что пользователь ввёл пустую строку.
Когда пробел не подходит
- Имя вроде «Анна Мария» нельзя надёжно прочитать обычным split как одно поле. Для таких данных заранее определите формат, например CSV с кавычками.
- Для дробных чисел выберите float или Decimal и задайте допустимый формат десятичного разделителя.
- В сетевом сервисе ограничивайте размер входа до разбора. input — удобный пример для терминала, а не готовая схема HTTP-валидации.
- Не используйте eval для превращения введённого текста в числа: это исполняет выражение вместо проверки данных.