Jak odczytać dane wejściowe jako liczby?


261

Dlaczego xi yciągi zamiast ints w poniższym kodzie?

(Uwaga: w Pythonie 2.x użytku raw_input(). W Pythonie 3.x wykorzystanie input(). raw_input()Został przemianowany na input()w Pythonie 3.x)

play = True

while play:

    x = input("Enter a number: ")
    y = input("Enter a number: ")

    print(x + y)
    print(x - y)
    print(x * y)
    print(x / y)
    print(x % y)

    if input("Play again? ") == "no":
        play = False

Odpowiedzi:


313

TLDR

  • Python 3 nie ocenia danych otrzymanych z inputfunkcją, ale inputrobi to funkcja Pythona 2 (przeczytaj następną sekcję, aby zrozumieć konsekwencje).
  • Odpowiednikiem Python 3 w Pythonie 3 inputjest raw_inputfunkcja.

Python 2.x

Były dwie funkcje do uzyskania danych wejściowych od użytkownika, nazwane inputi 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 inputoceni 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 + 17są 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 inttypu. Tak więc konwersja typu jest wykonywana za darmo i 22jest zwracana w wyniku inputi przechowywana w datazmiennej. Możesz myśleć o tym, inputjak raw_inputskomponowany z evalpołą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 inputz języka Python 2.x. W tej odpowiedzi wyjaśniłem, dlaczego należy zachować ostrożność podczas jego używania .

Ale raw_inputnie 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 inputi Python 2.x raw_inputsą podobne i raw_inputnie 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ć ints, 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 intfunkcji

>>> 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 floatraczej 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ę playzmiennej używając breaki while True.


Czy jest jakiś inny sposób, na przykład funkcja lub coś takiego, że nie musimy konwertować na int w 3.x poza jawną konwersją na int?
Shreyan Mehta,

@ShreyanMehta evalbędzie działać, ale nie idź na to, chyba że masz pilne powody.
thefourtheye

2
@ thefourtheye przynajmniej ast.literal_evaldo tego użyj . Nie ma obaw związanych z bezpieczeństwem eval.
spectras

4
Używam tego pytania i odpowiedzi jako celu dupe, ale może możesz dodać TDLR z rozwiązaniem python 3, tj. int(input()... na górze? Python 2 zbliża się do końca swojego życia, a informacja o Pythonie 3 jest zbyt pochowana IMO
Chris_Rands

Ostatni fragment dotyczący usuwania play jako zmiennej nie jest tak wygodny, ponieważ zmienna play czyni kod bardziej zrozumiałym. A sugerowanie, jak kod może się zmienić bez podania przyczyny, nie jest dobrą praktyką. W przeciwnym razie to ładna odpowiedź :)
OuuGiii

44

W Pythonie 3.x raw_inputzmieniono nazwę na inputi Python 2.x inputzostał usunięty.

Oznacza to, że, podobnie jak raw_input, inputw Pythonie 3.x zawsze zwraca obiekt ciąg.

Aby rozwiązać problem, musisz jawnie przekształcić te dane wejściowe w liczby całkowite, umieszczając je w int:

x = int(input("Enter a number: "))
y = int(input("Enter a number: "))

27

Dla wielu liczb całkowitych w jednym wierszu mapmoże być lepiej.

arr = map(int, raw_input().split())

Jeśli numer jest już znany (np. 2 liczby całkowite), możesz użyć

num1, num2 = map(int, raw_input().split())

16

input()(Python 3) i raw_input()(Python 2) zawsze zwracają ciągi. Bezpośrednio przekonwertuj wynik na liczbę całkowitą int().

x = int(input("Enter a number: "))
y = int(input("Enter a number: "))

11

Wiele pytań wymaga wprowadzenia kilku liczb całkowitych w jednym wierszu. Najlepszym sposobem jest wprowadzenie całego ciągu liczb w jednym wierszu, a następnie podzielenie ich na liczby całkowite. Oto wersja Python 3:

a = []
p = input()
p = p.split()      
for i in p:
    a.append(int(i))

Można również użyć listy

p = input().split("whatever the seperator is")

Aby przekonwertować wszystkie dane wejściowe z łańcucha na int, wykonaj następujące czynności

x = [int(i) for i in p]
print(x, end=' ')

wypisze elementy listy w linii prostej.


6

Konwertuj na liczby całkowite:

my_number = int(input("enter the number"))

Podobnie w przypadku liczb zmiennoprzecinkowych:

my_decimalnumber = float(input("enter the number"))

4
n=int(input())
for i in range(n):
    n=input()
    n=int(n)
    arr1=list(map(int,input().split()))

pętla for będzie działać „n” razy. drugie „n” jest długością tablicy. ostatnia instrukcja mapuje liczby całkowite na listę i przyjmuje dane wejściowe w postaci oddzielonej spacjami. możesz także zwrócić tablicę na końcu pętli for.


3

Podczas rozwiązywania problemu na CodeChef napotkałem problem z wprowadzaniem liczb całkowitych , gdzie dwie liczby całkowite - oddzielone spacją - powinny być odczytywane z jednego wiersza.

Chociaż int(input())wystarcza na jedną liczbę całkowitą, nie znalazłem bezpośredniego sposobu na wprowadzenie dwóch liczb całkowitych. Próbowałem tego:

num = input()
num1 = 0
num2 = 0

for i in range(len(num)):
    if num[i] == ' ':
        break

num1 = int(num[:i])
num2 = int(num[i+1:])

Teraz używam num1 i num2 jako liczb całkowitych. Mam nadzieję że to pomoże.


To wygląda bardzo interesująco. Czy jednak nie zostanie izniszczone po forwyjściu z pętli?

@hosch250Po wyjściu z pętli pozostaje wartość zmiennej indeksowej (tutaj, i). Wypróbowałem ten kawałek i działa poprawnie.
Aravind

1
W przypadku tego rodzaju manipulacji danymi wejściowymi możesz albo num1, num2 = map(int, input().split())wiedzieć, ile liczb całkowitych napotkasz, albo nums = list(map(int, input().split()))nie.
301_Moved_Permanently

3
def dbz():
    try:
        r = raw_input("Enter number:")
        if r.isdigit():
            i = int(raw_input("Enter divident:"))
            d = int(r)/i
            print "O/p is -:",d
        else:
            print "Not a number"
    except Exception ,e:
        print "Program halted incorrect data entered",type(e)
dbz()

Or 

num = input("Enter Number:")#"input" will accept only numbers

2

Podczas gdy w przykładzie, int(input(...))wystarcza w każdym razie python-futurejest builtins.inputto warte rozważenia, ponieważ to sprawia, że Twój prace kod dla obu Python 2 i 3 i domyślne zachowanie wyłącza python2 dnia inputstara się być «mądry» o typie danych wejściowych ( builtins.inputw zasadzie tylko zachowuje się jak raw_input).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.