TLDR
- Python 3 n'évalue pas les données reçues avec la
inputfonction, mais la inputfonction de Python 2 le fait (lisez la section suivante pour comprendre l'implication).
- L'équivalent de Python 2 de Python 3
inputest la raw_inputfonction.
Python 2.x
Il y avait deux fonctions pour obtenir une entrée utilisateur, appelées inputet raw_input. La différence entre eux est, raw_inputn'é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 + 17sont é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 inttype. Ainsi, la conversion de type est effectuée gratuitement et 22est retournée comme résultat de inputet stockée dans une datavariable. Vous pouvez penser inputcomme raw_inputcomposé avec un evalappel.
>>> 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 inputen Python 2.x. J'ai expliqué pourquoi il fallait être prudent lors de son utilisation, dans cette réponse .
Mais, raw_inputn'é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 inputet Python 2.x raw_inputsont similaires et raw_inputne 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 ints, 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 intfonction, 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 floatplutô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 playvariable en utilisant breaket while True.