Jaka jest różnica między raw_input()
i input()
w Pythonie 3?
input
do raw_input
ignorować błędy nazw.
Jaka jest różnica między raw_input()
i input()
w Pythonie 3?
input
do raw_input
ignorować błędy nazw.
Odpowiedzi:
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).
raw_input
...?” - „Różnica polega na tym, że nie ma raw_input
”. ... Całkiem drastyczna różnica, powiedziałbym!
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
.
eval()
i exec()
, ale najpierw musisz zrozumieć, dlaczego nie powinieneś używać eval()
przed podjęciem decyzji o użyciu.
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.
raw_input()
.
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.
raw_input()
został przemianowany na, input()
więc teraz input()
zwraca dokładny ciąg.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())
.
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 eval
funkcji.
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 helloworld
pokazał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.
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")