Python 2 input: что нужно знать при вводе данных
В Python 2 функция input() работает иначе, чем в Python 3: она считывает строку из стандартного ввода и сразу выполняет её как выражение Python (аналог eval(raw_input())). Это может быть удобно для быстрого ввода чисел, списков или других литералов, но создаёт серьёзные риски безопасности. Ниже рассмотрены основные подходы к вводу данных, их цели и возможные проблемы.
Основные подходы к вводу данных в Python 2
Как безопасно получить строку от пользователя без риска выполнения кода?
Наиболее эффективное и безопасное решение - использовать функцию raw_input(). Она возвращает введённую строку без какой-либо интерпретации. Последующее преобразование выполняется явно.
# Безопасный ввод имени
name = raw_input("Введите ваше имя: ")
print "Привет, " + namePython 2 input (функция input() в python 2)
Введите ваше имя: Иван Привет, Иван
Input python 3 (функция input() в python 3)
Проблема: если пользователь введёт число как строку, то операции над ним как над числом вызовут ошибку. Необходимо преобразовывать ввод.
Как получить целое число, используя raw_input?
age = int(raw_input("Сколько вам лет? "))
print "Вам", age, "лет"Сколько вам лет? 25 Вам 25 лет
Типичная ошибка: при вводе нечислового значения (например, "двадцать") возникнет ValueError. Рекомендуется использовать обработку исключений.
Как получить число с плавающей точкой и обработать ошибку?
try:
height = float(raw_input("Введите рост (м): "))
print "Рост:", height, "м"
except ValueError:
print "Ошибка: введите число, например 1.75"Введите рост (м): 1.82 Рост: 1.82 м
Введите рост (м): метр Ошибка: введите число, например 1.75
Как использовать оригинальный input() для быстрого ввода списка?
# Рискованно, но кратко
numbers = input("Введите список чисел (например, [1,2,3]): ")
print "Сумма:", sum(numbers)Введите список чисел (например, [1,2,3]): [10, 20, 30] Сумма: 60
Проблемы: если пользователь введёт __import__('os').system('rm -rf /'), код выполнится. Также возможны синтаксические ошибки при неверном вводе.
Как ввести логическое значение с проверкой?
answer = raw_input("Согласны? (да/нет): ").strip().lower()
if answer in ('да', 'yes', 'y'):
print "Согласие получено"
else:
print "Отказ"Согласны? (да/нет): Да Согласие получено
Как ввести несколько значений через пробел?
values = raw_input("Введите три числа через пробел: ").split()
a, b, c = map(int, values)
print "Сумма:", a + b + cВведите три числа через пробел: 5 10 20 Сумма: 35
Ошибка: если введено не 3 числа, возникнет ValueError. Добавьте проверку длины списка.
Дополнительные расширенные примеры работы с вводом в Python 2.
# Пример ввода списка чисел с проверкой и использованием eval (только для доверенного ввода)
# Внимание: eval опасно, используйте только если уверены во вводе
user_input = raw_input("Введите список чисел в формате [1,2,3]: ")
try:
data = eval(user_input)
if isinstance(data, list) and all(isinstance(x, (int, float)) for x in data):
print "Сумма элементов:", sum(data)
else:
print "Ошибка: введите список чисел"
except:
print "Ошибка: неверный синтаксис"Введите список чисел в формате [1,2,3]: [4,5,6] Сумма элементов: 15 Введите список чисел в формате [1,2,3]: abc Ошибка: неверный синтаксис
# Ввод нескольких значений с преобразованием и обработкой
# Запрашиваем у пользователя имя, возраст и город
name = raw_input("Ваше имя: ").strip()
try:
age = int(raw_input("Возраст: "))
except ValueError:
age = 0
print "Возраст не распознан, установлено 0"
city = raw_input("Город: ").strip()
print "Привет, %s! Тебе %d лет, ты живёшь в %s." % (name, age, city)Ваше имя: Елена Возраст: двадцать пять Возраст не распознан, установлено 0 Город: Москва Привет, Елена! Тебе 0 лет, ты живёшь в Москва.
# Ввод пароля (не отображается) с использованием getpass (в Python 2 отдельный модуль)
import getpass
password = getpass.getpass("Введите пароль: ")
print "Пароль принят (длина: %d)" % len(password)Введите пароль: Пароль принят (длина: 8)
# Ввод с проверкой диапазона чисел
def get_age():
while True:
try:
age = int(raw_input("Введите возраст (0-120): "))
if 0 <= age <= 120:
return age
else:
print "Возраст вне диапазона"
except ValueError:
print "Ошибка: введите целое число"
age = get_age()
print "Ваш возраст:", ageВведите возраст (0-120): 125 Возраст вне диапазона Введите возраст (0-120): 30 Ваш возраст: 30
# Ввод с обработкой нескольких ошибок и повторным запросом
choices = ['1', '2', '3']
while True:
input_str = raw_input("Выберите пункт (1, 2 или 3): ").strip()
if input_str in choices:
print "Вы выбрали:", input_str
break
else:
print "Неверный ввод, попробуйте снова"Выберите пункт (1, 2 или 3): 5 Неверный ввод, попробуйте снова Выберите пункт (1, 2 или 3): 2 Вы выбрали: 2
# Использование raw_input с заданием значения по умолчанию
default = "Гость"
name = raw_input("Ваше имя [%s]: " % default).strip()
if not name:
name = default
print "Привет, " + nameВаше имя [Гость]: Привет, Гость