Wie kann ich Eingaben als Zahlen lesen?

Dec 08 2013

Warum sind xund yZeichenfolgen anstelle von Ints im folgenden Code?

(Hinweis: In Python 2.x verwenden raw_input(). In Python 3.x verwenden input(). raw_input()Wurde input()in Python 3.x umbenannt.)

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

Antworten

328 thefourtheye Dec 08 2013 at 10:08

TLDR

  • Python 3 wertet die mit der inputFunktion empfangenen Daten nicht aus, die Funktion von Python 2 inputjedoch (lesen Sie den nächsten Abschnitt, um die Auswirkungen zu verstehen).
  • Das Äquivalent von Python 2 zu Python 3 inputist die raw_inputFunktion.

Python 2.x.

Es gab zwei Funktionen zum Abrufen von Benutzereingaben: inputund raw_input. Der Unterschied zwischen ihnen besteht darin, raw_inputdass die Daten nicht ausgewertet werden und wie sie sind in Zeichenfolgenform zurückgegeben werden. Es inputwird jedoch ausgewertet, was auch immer Sie eingegeben haben, und das Ergebnis der Bewertung wird zurückgegeben. Zum Beispiel,

>>> 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'>)

Die Daten 5 + 17werden ausgewertet und das Ergebnis ist 22. Wenn der Ausdruck ausgewertet wird 5 + 17, wird festgestellt, dass Sie zwei Zahlen hinzufügen, sodass das Ergebnis ebenfalls vom gleichen intTyp ist. Die Typkonvertierung erfolgt also kostenlos und 22wird als Ergebnis einer Variablen zurückgegeben inputund in dieser gespeichert data. Sie können uns vorstellen , inputwie das raw_inputmit einem zusammengesetzten evalAnruf.

>>> data = eval(raw_input("Enter a number: "))
Enter a number: 5 + 17
>>> data, type(data)
(22, <type 'int'>)

Hinweis: Sie sollten vorsichtig sein, wenn Sie inputPython 2.x verwenden. In dieser Antwort habe ich erklärt, warum man bei der Verwendung vorsichtig sein sollte .

Aber, raw_inputwertet nicht die Eingabe und kehrt wie es ist, als 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.

Python 3.x inputund Python 2.x raw_inputsind ähnlich und raw_inputin Python 3.x nicht verfügbar.

>>> 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'>)

Lösung

Um Ihre Frage zu beantworten, müssen Sie, da Python 3.x den Datentyp nicht auswertet und konvertiert, explizit wie folgt in ints konvertierenint

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

Mit dieser intFunktion können Sie Zahlen jeder Basis akzeptieren und direkt in Basis-10 konvertieren

>>> 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

Der zweite Parameter gibt an, auf welcher Basis die eingegebenen Zahlen basieren, und versteht sie dann intern und konvertiert sie. Wenn die eingegebenen Daten falsch sind, wird a ausgelöst 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'

Für Werte, die eine Bruchkomponente haben können, wäre der Typ floateher als int:

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

Abgesehen davon kann Ihr Programm ein wenig geändert werden

while True:
    ...
    ...
    if input("Play again? ") == "no":
        break

Sie können die playVariable mit breakund entfernen while True.

47 Noname Dec 08 2013 at 10:09

In Python 3.x raw_inputwurde umbenannt in inputund Python 2.x inputwurde entfernt.

Dies bedeutet , dass, so wie raw_input, inputin Python 3.x immer ein String - Objekt zurückgibt.

Um das Problem zu beheben, müssen Sie diese Eingaben explizit in Ganzzahlen umwandeln, indem Sie sie eingeben int:

x = int(input("Enter a number: "))
y = int(input("Enter a number: "))
29 user1341043 Nov 11 2014 at 07:32

Für mehrere Ganzzahlen in einer einzelnen Zeile ist dies mapmöglicherweise besser.

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

Wenn die Zahl bereits bekannt ist (z. B. 2 Ganzzahlen), können Sie sie verwenden

num1, num2 = map(int, raw_input().split())
18 MartijnPieters Dec 08 2013 at 10:09

input()(Python 3) und raw_input()(Python 2) geben immer Zeichenfolgen zurück. Konvertieren Sie das Ergebnis explizit in eine Ganzzahl mit int().

x = int(input("Enter a number: "))
y = int(input("Enter a number: "))
12 gumboy Jul 08 2014 at 07:13

Für mehrere Fragen müssen mehrere Ganzzahlen in einer Zeile eingegeben werden. Am besten geben Sie die gesamte Zahlenfolge in einer Zeile ein und teilen sie dann in ganze Zahlen auf. Hier ist eine Python 3-Version:

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

Auch ein Listenverständnis kann verwendet werden

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

Und um alle Eingaben von string nach int zu konvertieren, gehen wir wie folgt vor

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

druckt die Listenelemente in einer geraden Linie.

6 HemanthSavasere Apr 17 2016 at 23:20

In ganze Zahlen konvertieren:

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

Ähnliches gilt für Gleitkommazahlen:

my_decimalnumber = float(input("enter the number"))
4 ravitanwar Aug 03 2018 at 23:30
n=int(input())
for i in range(n):
    n=input()
    n=int(n)
    arr1=list(map(int,input().split()))

Die for-Schleife muss n-mal ausgeführt werden. Das zweite 'n' ist die Länge des Arrays. Die letzte Anweisung ordnet die Ganzzahlen einer Liste zu und nimmt Eingaben in durch Leerzeichen getrennter Form vor. Sie können das Array auch am Ende der for-Schleife zurückgeben.

3 Aravind May 23 2014 at 18:32

Beim Lösen eines Problems in CodeChef ist ein Problem mit der Eingabe von Ganzzahlen aufgetreten , bei dem zwei durch Leerzeichen getrennte Ganzzahlen aus einer Zeile gelesen werden sollten.

Während dies int(input())für eine einzelne Ganzzahl ausreicht, habe ich keinen direkten Weg gefunden, zwei Ganzzahlen einzugeben. Ich habe es versucht:

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:])

Jetzt benutze ich num1 und num2 als ganze Zahlen. Hoffe das hilft.

3 Sanyal Jun 30 2015 at 16:16
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 TobiasKienzler Nov 23 2016 at 19:19

Während in Ihrem Beispiel, int(input(...))den Trick in jedem Fall tut, python-futureist builtins.inputist eine Überlegung wert , da dies sicher funktioniert sowohl für Python 2 und 3 des Code macht und deaktiviert Python2 Standardverhalten von input‚clever‘ über den Eingabedatentyp (zu versuchen , builtins.inputim Grunde nur verhält sich wie raw_input).