TLDR
- Python 3 n'évalue pas les données reçues avec la
input
fonction, mais la input
fonction de Python 2 le fait (lisez la section suivante pour comprendre l'implication).
- L'équivalent de Python 2 de Python 3
input
est la raw_input
fonction.
Python 2.x
Il y avait deux fonctions pour obtenir une entrée utilisateur, appelées input
et raw_input
. La différence entre eux est, raw_input
n'évalue pas les données et retourne tel quel, sous forme de chaîne. Mais, input
évaluera tout ce que vous avez entré et le résultat de l'évaluation sera retourné. Par exemple,
>>> import sys
>>> sys.version
'2.7.6 (default, Mar 22 2014, 22:59:56) \n[GCC 4.8.2]'
>>> data = input("Enter a number: ")
Enter a number: 5 + 17
>>> data, type(data)
(22, <type 'int'>)
Les données 5 + 17
sont évaluées et le résultat est 22
. Lorsqu'il évalue l'expression 5 + 17
, il détecte que vous ajoutez deux nombres et donc le résultat sera également du même int
type. Ainsi, la conversion de type est effectuée gratuitement et 22
est retournée comme résultat de input
et stockée dans une data
variable. Vous pouvez penser input
comme raw_input
composé avec un eval
appel.
>>> data = eval(raw_input("Enter a number: "))
Enter a number: 5 + 17
>>> data, type(data)
(22, <type 'int'>)
Remarque: vous devez être prudent lorsque vous utilisez input
en Python 2.x. J'ai expliqué pourquoi il fallait être prudent lors de son utilisation, dans cette réponse .
Mais, raw_input
n'évalue pas l'entrée et retourne telle quelle, sous forme de chaîne.
>>> import sys
>>> sys.version
'2.7.6 (default, Mar 22 2014, 22:59:56) \n[GCC 4.8.2]'
>>> data = raw_input("Enter a number: ")
Enter a number: 5 + 17
>>> data, type(data)
('5 + 17', <type 'str'>)
Python 3.x
Python 3.x input
et Python 2.x raw_input
sont similaires et raw_input
ne sont pas disponibles dans Python 3.x.
>>> import sys
>>> sys.version
'3.4.0 (default, Apr 11 2014, 13:05:11) \n[GCC 4.8.2]'
>>> data = input("Enter a number: ")
Enter a number: 5 + 17
>>> data, type(data)
('5 + 17', <class 'str'>)
Solution
Pour répondre à votre question, puisque Python 3.x n'évalue pas et ne convertit pas le type de données, vous devez convertir explicitement en int
s, avec int
, comme ceci
x = int(input("Enter a number: "))
y = int(input("Enter a number: "))
Vous pouvez accepter des nombres de n'importe quelle base et les convertir directement en base-10 avec la int
fonction, comme ceci
>>> data = int(input("Enter a number: "), 8)
Enter a number: 777
>>> data
511
>>> data = int(input("Enter a number: "), 16)
Enter a number: FFFF
>>> data
65535
>>> data = int(input("Enter a number: "), 2)
Enter a number: 10101010101
>>> data
1365
Le deuxième paramètre indique quelle est la base des nombres entrés, puis en interne il le comprend et le convertit. Si les données saisies sont incorrectes, elles lanceront a ValueError
.
>>> data = int(input("Enter a number: "), 2)
Enter a number: 1234
Traceback (most recent call last):
File "<input>", line 1, in <module>
ValueError: invalid literal for int() with base 2: '1234'
Pour les valeurs qui peuvent avoir une composante fractionnaire, le type serait float
plutôt que int
:
x = float(input("Enter a number:"))
En dehors de cela, votre programme peut être légèrement modifié, comme ceci
while True:
...
...
if input("Play again? ") == "no":
break
Vous pouvez vous débarrasser de la play
variable en utilisant break
et while True
.