TLDR
- O Python 3 não avalia os dados recebidos com a
input
função, mas a input
funçã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_input
função.
Python 2.x
Havia duas funções para obter a entrada do usuário, chamadas input
e raw_input
. A diferença entre eles é raw_input
que não avalia os dados e retorna como são, na forma de sequência. Porém, input
avaliará 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 + 17
sã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 int
tipo. Portanto, a conversão do tipo é feita gratuitamente e 22
é retornada como resultado input
e armazenada na data
variável Você pode considerar input
o raw_input
composto com uma eval
chamada.
>>> 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 input
no Python 2.x. Expliquei por que devemos ter cuidado ao usá-lo, nesta resposta .
Mas, raw_input
nã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 input
e o Python 2.x raw_input
são semelhantes e raw_input
nã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 int
s, 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 int
funçã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 float
vez 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 play
variável usando break
e while True
.