В чем разница между `raw_input ()` и `input ()` в Python 3?

362

В чем разница между raw_input()и input()в Python 3?

pkumar
источник
3
Как вы делаете программу, которая принимает входные данные и Python 2 и Python 3 совместимы?
Соломон Уцко
2
Чтобы сделать это , вы пытаетесь установить inputв raw_inputи игнорировать ошибки имен.
Соломон Уцко
3
Посмотрите библиотеку 'six' для совместимости с python 2 и 3.
Джек Хоман,

Ответы:

418

Разница в том, что raw_input()не существует в Python 3.x, а input()существует. На самом деле старое raw_input()было переименовано input(), а старое input()исчезло, но его можно легко смоделировать с помощью eval(input()). (Помните, что eval()это зло. Попытайтесь использовать более безопасные способы анализа вашего ввода, если это возможно.)

Свен Марнах
источник
93
"Какая разница между raw_input...?" - «Разница в том, что нет raw_input». ... Я бы сказал, что это довольно радикальная разница!
ivan_pozdeev
9
Я полагаю, что в Python 2 они предполагали, что программисты на самом деле хотят «выполнить» команду, введенную пользователем, поскольку изначально (я предполагаю) запрос ввода от пользователя может быть только для этого. Но когда они поняли, что программисты могут также захотеть получить «необработанный» ввод, они разработали еще одну функцию, называемую «raw_input». В Python 3 они заметили, что это глупо, и просто удалили выполнение исходного ввода по умолчанию, получив только одну простую функцию.
JC Rocamonde
1
Repl.it, запускающий Py3.5.1, имеет raw_input () в качестве ключевого слова.
OldBunny2800
2
Следует сказать, что evalexec) в целом следует избегать, поскольку они могут представлять угрозу безопасности. За подробностями обращайтесь к Eval, который действительно опасен для SO ветеран Нед Бэтчелдер. И, конечно, этот совет относится и к старому Python 2 input.
PM 2Ring
1
@ PM2Ring Я добавил предупреждение к ответу. Конечно, есть действительные варианты использования для обоих eval()и exec(), но сначала вы должны понять, почему вы не должны использовать, eval()прежде чем принять решение использовать его.
Свен Марнах
192

В Python 2 , raw_input()возвращает строку, и input()пытается выполнить вход в качестве выражения Python.

Поскольку получение строки почти всегда было тем, что вы хотели, Python 3 делает это с input(). Как говорит Свен, если вы когда-нибудь захотите старое поведение, eval(input())работает.

Томас К
источник
7
Вы должны добавить, что Python 3 не имеет raw_input().
Мартин Тома
Какая польза от запуска ввода в качестве выражения Python?
Акшай Виджай Джайн
1
@AkshayVijayJain, вероятно, он был предназначен для ввода чисел. Но это совершенно небезопасно.
MarSoft
112

Python 2:

  • raw_input() берет именно то, что набрал пользователь, и передает его обратно в виде строки.

  • input()сначала берет, raw_input()а затем выполняет eval()на нем также.

Основным отличием является то, что input()ожидает синтаксически правильное выражение Python, где raw_input()нет.

Python 3:

  • raw_input()был переименован в, input()так что теперь input()возвращает точную строку.
  • Старый input()был удален.

Если вы хотите использовать старый input(), то есть вам нужно оценивать пользовательский ввод как оператор python, вы должны сделать это вручную, используя eval(input()).

screenglow
источник
26

В Python 3 raw_input()не существует, о чем уже упоминал Свен.

В Python 2 input()функция оценивает ваш ввод.

Пример:

name = input("what is your name ?")
what is your name ?harsha

Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    name = input("what is your name ?")
  File "<string>", line 1, in <module>
NameError: name 'harsha' is not defined

В приведенном выше примере Python 2.x пытается оценить harsha как переменную, а не строку. Чтобы избежать этого, мы можем использовать двойные кавычки вокруг нашего ввода, такие как "harsha":

>>> name = input("what is your name?")
what is your name?"harsha"
>>> print(name)
harsha

сырой ввод()

Функция raw_input () `не оценивает, она просто читает все, что вы вводите.

Пример:

name = raw_input("what is your name ?")
what is your name ?harsha
>>> name
'harsha'

Пример:

 name = eval(raw_input("what is your name?"))
what is your name?harsha

Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    name = eval(raw_input("what is your name?"))
  File "<string>", line 1, in <module>
NameError: name 'harsha' is not defined

В приведенном выше примере я просто пытался оценить пользовательский ввод с помощью evalфункции.

Харша Вардхан
источник
7

Я хотел бы добавить немного больше деталей к объяснению, предоставленному всеми для пользователей Python 2 . raw_input()что, к настоящему времени, вы знаете, что оценивает любые данные, которые пользователь вводит как строку. Это означает, что python не пытается даже понять введенные данные снова. Все, что он примет во внимание, это то, что введенные данные будут строковыми, независимо от того, является ли это действительной строкой, или int, или чем-то еще.

Хотя input()с другой стороны пытается понять данные, введенные пользователем. Таким образом, ввод вроде helloworldбы даже показывает ошибку как ' helloworld is undefined'.

В заключение, для python 2 , чтобы также ввести строку, вам нужно ввести ее как ' helloworld', которая является общей структурой, используемой в python для использования строк.

Rubal
источник
3

Если вы хотите убедиться, что ваш код работает с python2 и python3, используйте функцию input () в вашем скрипте и добавьте это в начало вашего скрипта:

from sys import version_info
if version_info.major == 3:
    pass
elif version_info.major == 2:
    try:
        input = raw_input
    except NameError:
        pass
else:
    print ("Unknown python version - input function not safe")
Йозеф Клоцнер
источник