¿Cuál es la diferencia entre `raw_input ()` y `input ()` en Python 3?

362

¿Cuál es la diferencia entre raw_input()y input()en Python 3?

pkumar
fuente
3
¿Cómo se hace un programa que recibe entradas compatibles con Python 2 y Python 3?
Solomon Ucko
2
Para ello se intenta establecer inputa raw_inpute ignorar los errores de identificación.
Solomon Ucko
3
Busque la biblioteca 'six' para compatibilidad con python 2 y 3.
Jack Homan

Respuestas:

418

La diferencia es que raw_input()no existe en Python 3.x, mientras que input()sí. En realidad, el viejo raw_input()ha sido renombrado input()y el viejo input()se ha ido, pero se puede simular fácilmente usando eval(input()). (Recuerde que eso eval()es malo. Intente utilizar formas más seguras de analizar su entrada si es posible).

Sven Marnach
fuente
93
"¿Cuál es la diferencia entre raw_input...?" - "La diferencia es que no hay raw_input". ... ¡Una diferencia bastante drástica, diría yo!
ivan_pozdeev
99
Supongo que en Python 2 asumieron que los programadores querían realmente "ejecutar" como un comando la entrada del usuario, ya que inicialmente (supongo) que solicitar la entrada del usuario podría ser solo para eso. Pero cuando se dieron cuenta de que los programadores también querrían obtener la entrada "en bruto", diseñaron otra función llamada "entrada en bruto". En Python 3 se dieron cuenta de lo estúpido que era eso y simplemente eliminaron la ejecución del valor predeterminado de entrada original, produciendo solo una función simple.
JC Rocamonde
1
Repl.it, ejecutar Py3.5.1 tiene raw_input () como palabra clave.
OldBunny2800
2
Es necesario decir que eval(y exec) generalmente deben evitarse porque pueden ser un riesgo para la seguridad. Para más detalles, consulte Eval realmente es peligroso por el veterano de SO Ned Batchelder. Y, por supuesto, ese consejo también se aplica al antiguo Python 2 input.
PM 2Ring
1
@ PM2Ring Agregué una advertencia a la respuesta. Por supuesto, hay casos de uso válidos para ambos eval()y exec(), pero primero debe comprender por qué no debe usarlo eval()antes de decidir usarlo.
Sven Marnach
192

En Python 2 , raw_input()devuelve una cadena e input()intenta ejecutar la entrada como una expresión de Python.

Dado que obtener una cadena era casi siempre lo que quería, Python 3 lo hace con input(). Como dice Sven, si alguna vez quieres el viejo comportamiento, eval(input())funciona.

Thomas K
fuente
77
Debe agregar que Python 3 no tiene raw_input().
Martin Thoma
¿De qué sirve la entrada en ejecución como expresión de Python?
Akshay Vijay Jain
1
@AkshayVijayJain, probablemente fue para ingresar números. Pero es totalmente inseguro.
MarSoft
112

Python 2:

  • raw_input() toma exactamente lo que el usuario escribió y lo devuelve como una cadena.

  • input()primero toma el raw_input()y luego realiza un eval()sobre él también.

La principal diferencia es que input()espera una declaración de Python sintácticamente correcta donde raw_input()no lo hace.

Python 3:

  • raw_input()fue renombrado a input()así que ahora input()devuelve la cadena exacta.
  • Viejo input()fue eliminado.

Si desea usar el antiguo input(), lo que significa que necesita evaluar una entrada del usuario como una declaración de Python, debe hacerlo manualmente usando eval(input()).

brillo de pantalla
fuente
26

En Python 3, raw_input()no existe lo que ya fue mencionado por Sven.

En Python 2, la input()función evalúa su entrada.

Ejemplo:

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

En el ejemplo anterior, Python 2.x está tratando de evaluar harsha como una variable en lugar de una cadena. Para evitar eso, podemos usar comillas dobles alrededor de nuestra entrada como "harsha":

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

Datos crudos()

La función raw_input () `no evalúa, solo leerá lo que ingrese.

Ejemplo:

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

Ejemplo:

 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

En el ejemplo anterior, solo estaba tratando de evaluar la entrada del usuario con la evalfunción.

Harsha Vardhan
fuente
7

Me gustaría agregar un poco más de detalle a la explicación proporcionada por todos para los usuarios de Python 2 . raw_input(), que, por ahora, sabes que evalúa los datos que el usuario ingresa como una cadena. Esto significa que python no intenta ni siquiera entender los datos ingresados ​​nuevamente. Todo lo que considerará es que los datos ingresados ​​serán una cadena, ya sea que se trate de una cadena real o int o algo así.

Mientras que input()por otro lado intenta comprender los datos ingresados ​​por el usuario. Entonces la entrada como helloworldincluso mostraría el error como ' helloworld is undefined'.

En conclusión, para python 2 , para ingresar una cadena también debe ingresarla como ' helloworld', que es la estructura común utilizada en python para usar cadenas.

Rubal
fuente
3

Si desea asegurarse de que su código se está ejecutando con python2 y python3, use la función input () en su script y agregue esto para comenzar su 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")
Josef Klotzner
fuente