Quelle est la différence entre `raw_input ()` et `input ()` en Python 3?

362

Quelle est la différence entre raw_input()et input()en Python 3?

pkumar
la source
3
Comment pouvez-vous rendre un programme qui prend en entrée compatible Python 2 et Python 3?
Solomon Ucko
2
Pour ce faire , vous essayez de définir inputà raw_inputet ignorer les erreurs de nom.
Solomon Ucko
3
Recherchez la bibliothèque «six» pour la compatibilité python 2 et 3.
Jack Homan

Réponses:

418

La différence est qu'il raw_input()n'existe pas dans Python 3.x, alors input()qu'il existe . En fait, l'ancien raw_input()a été renommé input()et l'ancien a input()disparu, mais peut facilement être simulé à l'aide de eval(input()). (N'oubliez pas que eval()c'est mauvais. Essayez d'utiliser des méthodes plus sûres pour analyser votre entrée si possible.)

Sven Marnach
la source
93
"Quelle est la différence entre raw_input...?" - "La différence est qu'il n'y a pas raw_input." ... Une différence assez radicale, je dirais!
ivan_pozdeev
9
Dans Python 2, je suppose qu'ils supposaient que les programmeurs voulaient réellement "exécuter" en tant que commande l'entrée utilisateur, car initialement (je suppose) demander l'entrée à l'utilisateur ne pouvait être que pour cela. Mais lorsqu'ils ont réalisé que les programmeurs pouvaient également vouloir obtenir l'entrée «brute», ils ont conçu une autre fonction appelée «raw_input». En Python 3, ils ont remarqué ce qui était stupide et ont simplement supprimé l'exécution par défaut de l'entrée d'origine, ne produisant qu'une seule fonction simple.
JC Rocamonde
1
Repl.it, l'exécution de Py3.5.1 a raw_input () comme mot-clé.
OldBunny2800
2
Il faut dire que eval(et exec) devraient généralement être évités car ils peuvent constituer un risque pour la sécurité. Pour plus de détails, veuillez consulter Eval est vraiment dangereux par le vétéran de SO Ned Batchelder. Et bien sûr, ces conseils s'appliquent également à l'ancien Python 2 input.
PM 2Ring
1
@ PM2Ring J'ai ajouté un avertissement à la réponse. Bien sûr, il existe des cas d'utilisation valides pour les deux eval()et exec(), mais vous devez d'abord comprendre pourquoi vous ne devriez pas utiliser eval()avant de décider de l'utiliser.
Sven Marnach
192

En Python 2 , raw_input()renvoie une chaîne et input()tente d'exécuter l'entrée en tant qu'expression Python.

Comme obtenir une chaîne était presque toujours ce que vous vouliez, Python 3 le fait avec input(). Comme le dit Sven, si jamais vous voulez l'ancien comportement, ça eval(input())marche.

Thomas K
la source
7
Vous devez ajouter que Python 3 n'en a pas raw_input().
Martin Thoma
quelle est l'utilité d'exécuter input comme expression python?
Akshay Vijay Jain
1
@AkshayVijayJain, il était probablement destiné à entrer des nombres. Mais c'est totalement dangereux.
MarSoft
112

Python 2:

  • raw_input() prend exactement ce que l'utilisateur a tapé et le retransmet sous forme de chaîne.

  • input()prend d'abord le raw_input()puis effectue également un eval()dessus.

La principale différence est input()qu'attend une instruction python syntaxiquement correcte où raw_input()non.

Python 3:

  • raw_input()a été renommé en renvoie input()maintenant input()la chaîne exacte.
  • L'ancien a input()été supprimé.

Si vous souhaitez utiliser l'ancien input(), ce qui signifie que vous devez évaluer une entrée utilisateur en tant qu'instruction python, vous devez le faire manuellement à l'aide de eval(input()).

lueur d'écran
la source
26

En Python 3, raw_input()n'existe pas qui a déjà été mentionné par Sven.

En Python 2, la input()fonction évalue votre entrée.

Exemple:

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

Dans l'exemple ci-dessus, Python 2.x essaie d'évaluer harsha comme une variable plutôt que comme une chaîne. Pour éviter cela, nous pouvons utiliser des guillemets doubles autour de notre entrée comme "harsha":

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

entrée brute()

La fonction raw_input () `n'évalue pas, elle lit simplement ce que vous entrez.

Exemple:

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

Exemple:

 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

Dans l'exemple ci-dessus, j'essayais simplement d'évaluer l'entrée utilisateur avec la evalfonction.

Harsha Vardhan
la source
7

Je voudrais ajouter un peu plus de détails à l'explication fournie par tout le monde pour les utilisateurs de python 2 . raw_input(), qui, à présent, vous savez qu'il évalue les données que l'utilisateur saisit sous forme de chaîne. Cela signifie que python n'essaie même pas de comprendre à nouveau les données saisies. Tout ce qu'il prendra en considération, c'est que les données saisies seront des chaînes, qu'il s'agisse ou non d'une chaîne réelle ou int ou quoi que ce soit.

Alors que input()d'autre part essaie de comprendre les données saisies par l'utilisateur. Ainsi, l'entrée comme helloworldafficherait même l'erreur comme ' helloworld is undefined'.

En conclusion, pour python 2 , pour entrer aussi une chaîne, vous devez la saisir comme ' helloworld' qui est la structure commune utilisée en python pour utiliser des chaînes.

Rubal
la source
3

Si vous voulez vous assurer que votre code s'exécute avec python2 et python3, utilisez la fonction input () dans votre script et ajoutez ceci pour commencer votre 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
la source