TLDR
- Python 3 nie ocenia danych otrzymanych z
input
funkcją, ale input
robi to funkcja Pythona 2 (przeczytaj następną sekcję, aby zrozumieć konsekwencje).
- Odpowiednikiem Python 3 w Pythonie 3
input
jest raw_input
funkcja.
Python 2.x
Były dwie funkcje do uzyskania danych wejściowych od użytkownika, nazwane input
i raw_input
. Różnica między nimi polega na tym, raw_input
że dane nie są analizowane i zwracane są w postaci ciągów znaków. Ale input
oceni wszystko, co wpisałeś, a wynik oceny zostanie zwrócony. Na przykład,
>>> 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'>)
Dane 5 + 17
są oceniane i wynik jest 22
. Kiedy ocenia wyrażenie 5 + 17
, wykrywa, że dodajesz dwie liczby, więc wynik będzie również tego samego int
typu. Tak więc konwersja typu jest wykonywana za darmo i 22
jest zwracana w wyniku input
i przechowywana w data
zmiennej. Możesz myśleć o tym, input
jak raw_input
skomponowany z eval
połączeniem.
>>> data = eval(raw_input("Enter a number: "))
Enter a number: 5 + 17
>>> data, type(data)
(22, <type 'int'>)
Uwaga: należy zachować ostrożność podczas korzystania input
z języka Python 2.x. W tej odpowiedzi wyjaśniłem, dlaczego należy zachować ostrożność podczas jego używania .
Ale raw_input
nie ocenia danych wejściowych i zwraca jako taki ciąg znaków.
>>> 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
i Python 2.x raw_input
są podobne i raw_input
nie są dostępne w 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'>)
Rozwiązanie
Aby odpowiedzieć na to pytanie, ponieważ Python 3.x nie ocenia i konwersji typu danych, trzeba jawnie przekonwertować int
s, z int
, jak to
x = int(input("Enter a number: "))
y = int(input("Enter a number: "))
Możesz zaakceptować liczby dowolnej bazy i przekonwertować je bezpośrednio na bazę-10 za pomocą takiej int
funkcji
>>> 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
Drugi parametr mówi, jaka jest podstawa wprowadzonych liczb, a następnie wewnętrznie go rozumie i konwertuje. Jeśli wprowadzone dane są błędne, wyrzuci 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'
W przypadku wartości, które mogą zawierać komponent ułamkowy, typem byłoby float
raczej niż int
:
x = float(input("Enter a number:"))
Poza tym twój program można trochę zmienić, w ten sposób
while True:
...
...
if input("Play again? ") == "no":
break
Możesz pozbyć się play
zmiennej używając break
i while True
.