Jaka jest różnica między `raw_input ()` a `input ()` w Pythonie 3?

362

Jaka jest różnica między raw_input()i input()w Pythonie 3?

pkumar
źródło
3
Jak stworzyć program, który pobiera dane wejściowe zarówno w języku Python 2, jak i Python 3?
Solomon Ucko
2
Aby to zrobić, aby spróbować zestawu inputdo raw_inputignorować błędy nazw.
Solomon Ucko
3
Wyszukaj bibliotekę „six” pod kątem zgodności z Python 2 i 3.
Jack Homan,

Odpowiedzi:

418

Różnica polega na tym, że raw_input()nie istnieje w Pythonie 3.x, podczas gdy input()robi. W rzeczywistości stary raw_input()został przemianowany input()na stary, a stary input()zniknął, ale można go łatwo symulować za pomocą eval(input()). (Pamiętaj, że eval()to zło. Spróbuj zastosować bezpieczniejsze sposoby analizowania danych wejściowych, jeśli to możliwe).

Sven Marnach
źródło
93
„Jaka jest różnica między raw_input...?” - „Różnica polega na tym, że nie ma raw_input”. ... Całkiem drastyczna różnica, powiedziałbym!
ivan_pozdeev
9
Wydaje mi się, że w Pythonie 2 programiści chcieli faktycznie „wykonać” polecenie wprowadzone przez użytkownika, ponieważ początkowo (tak sądzę) żądanie użytkownika może być przeznaczone tylko do tego. Ale kiedy zdali sobie sprawę, że programiści mogą również chcieć uzyskać wejście „raw”, zaprojektowali inną funkcję o nazwie „raw_input”. W Pythonie 3 zauważyli, co to jest głupie, i po prostu usunęli pierwotne wykonanie domyślnego wejścia, uzyskując tylko jedną prostą funkcję.
JC Rocamonde,
1
Repl.it, uruchamianie Py3.5.1 ma słowo kluczowe raw_input ().
OldBunny2800
2
Trzeba powiedzieć, że eval(i exec) należy zasadniczo unikać, ponieważ może to stanowić zagrożenie bezpieczeństwa. Aby uzyskać szczegółowe informacje, zobacz Eval jest naprawdę niebezpieczny dla weterana SO Neda Batcheldera. I oczywiście ta rada dotyczy również starego Pythona 2 input.
PM 2,
1
@ PM2Ring Dodałem ostrzeżenie do odpowiedzi. Oczywiście istnieją ważne przypadki użycia dla obu eval()i exec(), ale najpierw musisz zrozumieć, dlaczego nie powinieneś używać eval()przed podjęciem decyzji o użyciu.
Sven Marnach
192

W Pythonie 2 , raw_input()zwraca ciąg znaków i input()próbuje uruchomić wejście jako wyrażenie Pythona.

Ponieważ otrzymywanie łańcucha było prawie zawsze tym, czego chciałeś, Python 3 robi to z input(). Jak mówi Sven, jeśli kiedykolwiek chcesz starego zachowania, eval(input())działa.

Thomas K.
źródło
7
Należy dodać, że Python 3 nie ma raw_input().
Martin Thoma,
jaki jest pożytek z uruchamiania danych wejściowych jako wyrażenia python
Akshay Vijay Jain
1
@AkshayVijayJain, prawdopodobnie był przeznaczony do wprowadzania liczb. Ale to jest całkowicie niebezpieczne.
MarSoft,
112

Python 2:

  • raw_input() pobiera dokładnie to, co wpisał użytkownik i przekazuje z powrotem jako ciąg.

  • input()najpierw bierze, raw_input()a następnie wykonuje eval()na nim również.

Główną różnicą jest to, że input()oczekuje poprawnej składni instrukcji Pythona, w przypadku raw_input()gdy nie.

Python 3:

  • raw_input()został przemianowany na, input()więc teraz input()zwraca dokładny ciąg.
  • Stare input()zostało usunięte.

Jeśli chcesz użyć starego input(), co oznacza, że ​​musisz ocenić dane wejściowe użytkownika jako instrukcję python, musisz to zrobić ręcznie, używając eval(input()).

poświata
źródło
26

W Pythonie 3 raw_input()nie istnieje, o czym wspomniał Sven.

W Pythonie 2 input()funkcja ocenia dane wejściowe.

Przykład:

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

W powyższym przykładzie Python 2.x próbuje ocenić harsha jako zmienną, a nie ciąg znaków. Aby tego uniknąć, możemy użyć podwójnych cudzysłowów wokół naszych danych wejściowych, takich jak „harsha”:

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

raw_input ()

Funkcja raw_input () `nie ocenia, po prostu odczyta wszystko, co wpiszesz.

Przykład:

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

Przykład:

 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

W powyższym przykładzie próbowałem tylko ocenić dane wejściowe użytkownika za pomocą tej evalfunkcji.

Harsha Vardhan
źródło
7

Chciałbym dodać trochę więcej szczegółów do wyjaśnienia udzielonego przez wszystkich użytkownikom python 2 . raw_input(), który do tej pory wiesz, że ocenia, jakie dane użytkownik wprowadza jako ciąg. Oznacza to, że python nie próbuje nawet zrozumieć wprowadzonych danych. Wszystko, co weźmie pod uwagę, to to, że wprowadzone dane będą ciągiem znaków, bez względu na to, czy jest to ciąg rzeczywisty, int, czy cokolwiek innego.

Z input()drugiej strony próbuje zrozumieć dane wprowadzone przez użytkownika. Więc dane wejściowe helloworldpokazałyby nawet błąd jako „ helloworld is undefined”.

Podsumowując, w przypadku Pythona 2 również w celu wprowadzenia łańcucha należy wprowadzić ciąg podobny do „ helloworld”, który jest wspólną strukturą używaną w Pythonie do używania ciągów.

Rubal
źródło
3

Jeśli chcesz się upewnić, że Twój kod działa z python2 i python3, użyj funkcji input () w skrypcie i dodaj to na początku skryptu:

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")
Josef Klotzner
źródło