Qual è la differenza tra `raw_input ()` e `input ()` in Python 3?


362

Qual è la differenza tra raw_input()e input()in Python 3?


3
Come si crea un programma che accetta input compatibili con Python 2 e Python 3?
Solomon Ucko,

2
Per fare questo si tenta di impostare inputper raw_inpute ignorare gli errori di nome.
Solomon Ucko,

3
Cerca la libreria "sei" per la compatibilità con Python 2 e 3.
Jack Homan,

Risposte:


418

La differenza è che raw_input()non esiste in Python 3.x, mentre input()esiste. In realtà, il vecchio raw_input()è stato rinominato input()e il vecchio non input()c'è più, ma può essere facilmente simulato usando eval(input()). (Ricorda che eval()è un male. Cerca di usare modi più sicuri per analizzare il tuo input, se possibile.)


93
"Qual è la differenza tra raw_input...?" - "La differenza è che non c'è raw_input." ... Una differenza drastica, direi!
ivan_pozdeev,

9
In Python 2 suppongo che i programmatori volessero effettivamente "eseguire" come comando l'input dell'utente, poiché inizialmente (suppongo) richiedere l'input dell'utente potrebbe essere solo per quello. Ma quando hanno capito che i programmatori potrebbero anche voler ottenere l'input "raw", hanno progettato un'altra funzione chiamata "raw_input". In Python 3 notarono che cosa era stupido e semplicemente cancellarono l'esecuzione del default di input originale, ottenendo solo una semplice funzione.
JC Rocamonde,

1
Repl.it, eseguendo Py3.5.1 ha raw_input () come parola chiave.
OldBunny2800,

2
Va detto che eval(e exec) dovrebbero essere generalmente evitati perché possono rappresentare un rischio per la sicurezza. Per i dettagli, vedi Eval è davvero pericoloso dal veterano SO Ned Batchelder. E ovviamente questo consiglio vale anche per il vecchio Python 2 input.
PM 2Ring

1
@ PM2Ring Ho aggiunto un avviso alla risposta. Naturalmente ci sono casi d'uso validi per entrambi eval()e exec(), ma devi prima capire perché non dovresti usare eval()prima di decidere di usarlo.
Sven Marnach,

192

In Python 2 , raw_input()restituisce una stringa e input()tenta di eseguire l'input come espressione Python.

Dato che ottenere una stringa era quasi sempre quello che volevi, Python 3 lo fa input(). Come dice Sven, se mai vuoi il vecchio comportamento, eval(input())funziona.


7
Dovresti aggiungere che Python 3 non ha raw_input().
Martin Thoma,

a che serve eseguire l'input come espressione python?
Akshay Vijay Jain,

1
@AkshayVijayJain, probabilmente era destinato all'inserimento di numeri. Ma è totalmente pericoloso.
MarSoft,

112

Python 2:

  • raw_input() prende esattamente ciò che l'utente ha digitato e lo restituisce come una stringa.

  • input()prima prende il raw_input()e poi esegue anche eval()su di esso.

La differenza principale è che si input()aspetta un'istruzione pitone sintatticamente corretta dove raw_input()no.

Python 3:

  • raw_input()è stato rinominato in input()modo che ora input()restituisca la stringa esatta.
  • Il vecchio è input()stato rimosso.

Se vuoi usare il vecchio input(), nel senso che devi valutare un input dell'utente come un'istruzione python, devi farlo manualmente usando eval(input()).


26

In Python 3, raw_input()non esiste che è già stato menzionato da Sven.

In Python 2, la input()funzione valuta il tuo input.

Esempio:

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

Nell'esempio sopra, Python 2.x sta provando a valutare harsha come una variabile piuttosto che una stringa. Per evitarlo, possiamo usare virgolette doppie attorno al nostro input come "harsha":

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

raw_input ()

La funzione raw_input () `non valuta, leggerà semplicemente qualunque cosa tu inserisca.

Esempio:

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

Esempio:

 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

Nell'esempio sopra, stavo solo cercando di valutare l'input dell'utente con la evalfunzione.


7

Vorrei aggiungere un po 'più di dettaglio alla spiegazione fornita da tutti per gli utenti di Python 2 . raw_input(), che ormai sai che valuta tutti i dati immessi dall'utente come stringa. Ciò significa che python non prova nemmeno a comprendere nuovamente i dati inseriti. Tutto ciò che verrà considerato è che i dati immessi saranno stringa, indipendentemente dal fatto che si tratti di una stringa o di un int reale o altro.

Mentre input()sugli altri tentativi mano per comprendere i dati inseriti dall'utente. Quindi l'input like helloworldmostrerebbe anche l'errore come ' helloworld is undefined'.

In conclusione, per python 2 , anche per inserire una stringa è necessario inserirla come ' helloworld' che è la struttura comune usata in Python per usare le stringhe.


3

Se vuoi assicurarti che il tuo codice sia in esecuzione con python2 e python3, usa la funzione input () nel tuo script e aggiungi questo per iniziare il tuo script:

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")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.