Яка різниця між `raw_input ()` та `input ()` в Python 3?


362

Яка різниця між raw_input()і input()в Python 3?


3
Як зробити програму, яка приймає вхід і Python 2, і Python 3?
Соломон Учко

2
Щоб зробити це , ви намагаєтеся встановити inputв raw_inputі ігнорувати помилки імен.
Соломон Учко

3
Знайдіть бібліотеку «шість» для сумісності 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?
Akshay Vijay Jain

1
@AkshayVijayJain, ймовірно, він був призначений для введення цифр. Але це абсолютно небезпечно.
MarSoft

112

Пітон 2:

  • raw_input() приймає саме те, що ввів користувач, і передає його назад як рядок.

  • input()спочатку бере, raw_input()а потім виконує і eval()його.

Основна відмінність полягає в тому, що input()очікує синтаксично правильного твердження python, де raw_input()цього немає.

Пітон 3:

  • raw_input()було перейменовано на, input()тому тепер input()повертає точний рядок.
  • Старого input()зняли.

Якщо ви хочете використовувати старий input(), тобто вам потрібно оцінити введення користувача як оператор python, ви повинні зробити це вручну, використовуючи eval(input()).


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 намагається оцінити харшу як змінну, а не рядок. Щоб уникнути цього, ми можемо використовувати подвійні лапки навколо нашого вкладу, як "харша":

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

raw_input ()

Функція 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 для використання рядків.


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")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.