TLDR
- O Python 3 não avalia os dados recebidos com a
inputfunção, mas a inputfunção do Python 2 faz (leia a próxima seção para entender a implicação).
- O equivalente do Python 2 ao Python 3
inputé a raw_inputfunção.
Python 2.x
Havia duas funções para obter a entrada do usuário, chamadas inpute raw_input. A diferença entre eles é raw_inputque não avalia os dados e retorna como são, na forma de sequência. Porém, inputavaliará o que você inseriu e o resultado da avaliação será retornado. Por exemplo,
>>> 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'>)
Os dados 5 + 17são avaliados e o resultado é 22. Ao avaliar a expressão 5 + 17, ele detecta que você está adicionando dois números e, portanto, o resultado também será do mesmo inttipo. Portanto, a conversão do tipo é feita gratuitamente e 22é retornada como resultado inpute armazenada na datavariável Você pode considerar inputo raw_inputcomposto com uma evalchamada.
>>> data = eval(raw_input("Enter a number: "))
Enter a number: 5 + 17
>>> data, type(data)
(22, <type 'int'>)
Nota: você deve ter cuidado ao usar inputno Python 2.x. Expliquei por que devemos ter cuidado ao usá-lo, nesta resposta .
Mas, raw_inputnão avalia a entrada e retorna como é, como uma string.
>>> 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
O Python 3.x inpute o Python 2.x raw_inputsão semelhantes e raw_inputnão estão disponíveis no 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'>)
Solução
Para responder à sua pergunta, como o Python 3.x não avalia e converte o tipo de dados, você deve converter explicitamente para ints, com int, desta forma
x = int(input("Enter a number: "))
y = int(input("Enter a number: "))
Você pode aceitar números de qualquer base e convertê-los diretamente na base 10 com a intfunção
>>> 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
O segundo parâmetro informa qual é a base dos números inseridos e, em seguida, ele entende e converte internamente. Se os dados inseridos estiverem errados, será gerado 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'
Para valores que podem ter um componente fracionário, o tipo seria, em floatvez de int:
x = float(input("Enter a number:"))
Além disso, seu programa pode ser alterado um pouco, como este
while True:
...
...
if input("Play again? ") == "no":
break
Você pode se livrar da playvariável usando breake while True.