Wie kann ich Eingaben als Zahlen lesen?
Warum sind x
und y
Zeichenfolgen 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
TLDR
- Python 3 wertet die mit der
input
Funktion empfangenen Daten nicht aus, die Funktion von Python 2input
jedoch (lesen Sie den nächsten Abschnitt, um die Auswirkungen zu verstehen). - Das Äquivalent von Python 2 zu Python 3
input
ist dieraw_input
Funktion.
Python 2.x.
Es gab zwei Funktionen zum Abrufen von Benutzereingaben: input
und raw_input
. Der Unterschied zwischen ihnen besteht darin, raw_input
dass die Daten nicht ausgewertet werden und wie sie sind in Zeichenfolgenform zurückgegeben werden. Es input
wird 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 + 17
werden 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 int
Typ ist. Die Typkonvertierung erfolgt also kostenlos und 22
wird als Ergebnis einer Variablen zurückgegeben input
und in dieser gespeichert data
. Sie können uns vorstellen , input
wie das raw_input
mit einem zusammengesetzten eval
Anruf.
>>> 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 input
Python 2.x verwenden. In dieser Antwort habe ich erklärt, warum man bei der Verwendung vorsichtig sein sollte .
Aber, raw_input
wertet 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 input
und Python 2.x raw_input
sind ähnlich und raw_input
in 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 int
s konvertierenint
x = int(input("Enter a number: "))
y = int(input("Enter a number: "))
Mit dieser int
Funktion 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 float
eher 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 play
Variable mit break
und entfernen while True
.
In Python 3.x raw_input
wurde umbenannt in input
und Python 2.x input
wurde entfernt.
Dies bedeutet , dass, so wie raw_input
, input
in 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: "))
Für mehrere Ganzzahlen in einer einzelnen Zeile ist dies map
mö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())
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: "))
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.
In ganze Zahlen konvertieren:
my_number = int(input("enter the number"))
Ähnliches gilt für Gleitkommazahlen:
my_decimalnumber = float(input("enter the number"))
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.
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.
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
Während in Ihrem Beispiel, int(input(...))
den Trick in jedem Fall tut, python-future
ist builtins.input
ist 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.input
im Grunde nur verhält sich wie raw_input
).