Wie kann ich Eingaben als Zahlen lesen?

261

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

Antworten:

313

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. Beispielsweise,

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

Sie können Zahlen jeder Basis akzeptieren und mit dieser intFunktion 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.

thefourtheye
quelle
Gibt es eine andere Möglichkeit, wie eine Funktion oder etwas anderes, damit wir in 3.x nicht in int konvertieren müssen, außer eine explizite Konvertierung in int?
Shreyan Mehta
@ShreyanMehta evalwürde funktionieren, aber machen Sie das nicht, es sei denn, Sie haben dringende Gründe.
thefourtheye
2
@thefourtheye zumindest dafür verwenden ast.literal_eval. Es hat nicht die Sicherheitsbedenken von eval.
Spektren
4
Ich verwende diese Fragen und Antworten als betrügerisches Ziel, aber vielleicht können Sie eine TDLR mit der Python 3-Lösung hinzufügen, dh int(input()... oben? Python 2 nähert sich dem Ende seines Lebens und die Python 3-Informationen sind zu begraben IMO
Chris_Rands
Das letzte bisschen über das Entfernen von Play als Variable ist nicht so praktisch, da das Spielen von Variablen den Code verständlicher macht. Es ist keine gute Praxis, Vorschläge zu machen, wie sich der Code ohne Grund ändern könnte. Ansonsten ist es eine schöne Antwort :)
OuuGiii
44

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: "))
Georgy
quelle
27

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())
user1341043
quelle
16

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: "))
Martijn Pieters
quelle
11

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.

Gumboy
quelle
6

In ganze Zahlen konvertieren:

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

Ähnliches gilt für Gleitkommazahlen:

my_decimalnumber = float(input("enter the number"))
Hemanth Savasere
quelle
4
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.

Ravi Tanwar
quelle
3

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.

Aravind
quelle
Das sieht sehr interessant aus. Wird es jedoch nicht izerstört, wenn die forSchleife verlassen wird?
@hosch250Wenn eine Schleife verlassen wird, ibleibt der Wert der Indexvariablen (hier ) erhalten. Ich habe dieses Stück ausprobiert und es funktioniert richtig.
Aravind
1
Bei dieser Art der Eingabemanipulation können Sie entweder num1, num2 = map(int, input().split())festlegen, auf wie viele Ganzzahlen Sie stoßen, oder nums = list(map(int, input().split()))nicht.
301_Moved_Permanent
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
Sanyal
quelle
2

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

Tobias Kienzler
quelle