Kontrollabfrage, ob eine Zahl eingegeben wurde

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Horst
User
Beiträge: 37
Registriert: Mittwoch 14. April 2010, 17:55

Hallo,
Ich habe das Problem, dass ich gerne eine eingabe überprüfen möchte. Es soll gefragt werden, ob die Eingabe eine Zahl ist.
Kann mir jemand sagen, welchen Befehl ich eingeben muss???
Im Moment siehts bei mir so aus:

a = int (input ('Anzahl der Messreihen: '))
if a != int:
print ('Falsche Eingabe')
a = int (input ('Anzahl der Messreihen: '))

Ich hab einfach mal als Bedingung a!= int eingegeben. Dass das nicht gehen kann ist mir klar.
Danke schon mal
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

1. Benutze bitte code-Tags, Leerzeichen sind bei Python signifikant und die gehen sonst verloren.
2. Wenn du python < Version 3 verwendest bitte raw_input statt input verwenden. Warum steht in der Doku zu input.
3. Hast du deinen Code wenigstens mal durchlaufen lassen und geguckt was passiert, wenn du keine Zahl eingibst? Vermutlich nicht, sonst hätte deine Frage anders ausgesehen.
Horst
User
Beiträge: 37
Registriert: Mittwoch 14. April 2010, 17:55

Danke für die schnelle Antwort!
Ich benutze Python 3.1
Ich hab das Programm durchlaufen lassen. Wenn ich etwas anderes als eine Zahl eingebe erhalte ich folgende Fehlermeldung:

Traceback (most recent call last):
File "C:\Users\Horst\Desktop\Programm_259.py", line 3, in <module>
a = int (input ('Anzahl der Messreihen: '))
ValueError: invalid literal for int() with base 10: 'e'

Du hast geschrieben, dass ich raw_input verwenden soll. das funktioniert aber auch nicht so recht.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

raw_input bei Python 2.x

das sind codetags

Code: Alles auswählen

try: int(x)
except ValueError: print 'error'
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
xpilz
User
Beiträge: 76
Registriert: Sonntag 11. April 2010, 12:46
Wohnort: Deutschland
Kontaktdaten:

Ganz simpel:

Code: Alles auswählen

if type(x) == int:
	#x ist int
else:
	#x ist kein int
type(object)

Die Funktion type gibt den Datentyp der übergebenen Instanz object zurück.
wenn es das ist was du meintest.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Da du 3.1 benutzt ist input schon der richtige Weg. Den Rest hat jbs ja schon verraten.

Aber die Fehlermeldung sagt doch eigentlich schon alles: "e" ist eben keine Zahl.
xpilz hat geschrieben:Ganz simpel:

Code: Alles auswählen

if type(x) == int:
	#x ist int
else:
	#x ist kein int
wenn es das ist was du meintest.
Und wie viel man doch falsch machen kann ;-) Wenn man schon der Meinung ist, dass man Typen testen will, was man eigentlich fast nie möchte, dann nicht mit "type" sondern mit "isinstance". Dann erkennt man auch Vererbung.

Sebastian
Das Leben ist wie ein Tennisball.
Horst
User
Beiträge: 37
Registriert: Mittwoch 14. April 2010, 17:55

Das hat nun geklappt. Jetzt geht alles.
Besten Dank :D
Benutzeravatar
xpilz
User
Beiträge: 76
Registriert: Sonntag 11. April 2010, 12:46
Wohnort: Deutschland
Kontaktdaten:

Ja, ich weiß nicht welche welche Art du nun benutzt, die von EyDu oder die von mir. Was EyDu sagt scheint mir nämlich ziemlich überzeugend type() nicht zu benutzen, obwohl ich davon in dem Bereich noch keine ahnung habe..

@EyDu: Das war jetzt die einzigste Methode typen zu prüfen, über die ich gelesen habe. So weit, viele Alternativen zu bilden, bin ich noch nicht. Wollte ich nur gesagt haben.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

xpilz hat geschrieben:Ja, ich weiß nicht welche welche Art du nun benutzt, die von EyDu oder die von mir. Was EyDu sagt scheint mir ziemlich überzeugend type() nicht zu benutzen, obwohl ich davon noch keine ahnung habe..
Die werden beide nicht funktionieren, wenn er nicht wie in jbs Post angegeben die Ausnahme abfängt. Und wenn er das tut, ist die Abfrage des Typs sowieso überflüssig, da es dann nur int sein kann.
Horst
User
Beiträge: 37
Registriert: Mittwoch 14. April 2010, 17:55

Ich habs jetzt so gemacht:

a = input ('Anzahl derWerte: ')
while type (a) == int:
print ('Falsche Eingabe')
a = input ('Anzahl der Messreihen: ')
continue
Benutzeravatar
xpilz
User
Beiträge: 76
Registriert: Sonntag 11. April 2010, 12:46
Wohnort: Deutschland
Kontaktdaten:

Ich denke mal, da sind wir gleich auf. Ohne HIlfe hätte ich es nämlich auch so ähnlich gemacht wie du.
Um aber jbs,EyDu und Darii mit einzubeziehen würde ich sagen, das diese Version besser ist, aber aus welchem Grund müssten dir andere erklären :/.
jbs hat geschrieben:

Code: Alles auswählen

x = input('Anzahl der Werte: ')
try: int(x)
except ValueError: print 'Falsche Eingabe.' 
Das Beispiel von jbs nur ein wenig verändert. Ich hoffe das ist nicht so wichtig.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

@Horst: Dein Code kann nicht funktionieren. a ist immer ein String und damit ist die Bedinung des while immer false. Eine Typumwandlung findet nirgends statt.
xpilz hat geschrieben:Um aber jbs,EyDu und Darii mit einzubeziehen würde ich sagen, das diese Version besser ist, aber aus welchem Grund müssten dir andere erklären :/.
Erstmal, weil sie funktioniert ;-) Für eine genaue Erklärung suchst du mal nach dem EAFP- und dem LBYL-Prinzip. Ersteres wird in Python vorgezogen. Ganz grob ausgedrückt: Gehe erstmal davon aus, dass der normale/erwartete Programmfluss genommen wird, wenn nicht, dann reagiere. LBLY geht das Problem aus der anderen Richtung an.
Das Leben ist wie ein Tennisball.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Code: Alles auswählen

while True:
    a = input ('Anzahl der Messreihen: ')
    try:
        a = int(a)
   except ValueError:
       print('Falsche Eingabe')
   else:
       break
the more they change the more they stay the same
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

String eingeben und dann String Method .isdigit() benutzen


Werf ich einfach mal so rein, ist imo der "richtige" weg.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

try-except ist in Python der beste und sicherste Weg.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Mad-Marty hat geschrieben:String eingeben und dann String Method .isdigit() benutzen
Werf ich einfach mal so rein, ist imo der "richtige" weg.
Da stehst du aber relativ alleine auf deiner Seite ;-) Der try-except-Ansatz ist eigentlich Standard.
Das Leben ist wie ein Tennisball.
Horst
User
Beiträge: 37
Registriert: Mittwoch 14. April 2010, 17:55

Danke Dav1d. Dein Weg funktioniert einwandfrei. Jetzt klapps
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Gerne :)

Zu .isdigit:

Code: Alles auswählen

>>> int(-5)
-5
>>> '-5'.isdigit()
False
the more they change the more they stay the same
STORMBREAKER
User
Beiträge: 1
Registriert: Samstag 23. Dezember 2017, 19:01

Ich würde einfach direkt nur eine Eingabe als Integer zulassen. Das geht mit:

Code: Alles auswählen

Eingabe = int(input("Eingabe:"))
Benutzeravatar
noisefloor
User
Beiträge: 4187
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@STROMBREAKER: das ist schlechtweg falsch. Du kannst _alles_ eingeben - nur bekommst du eine Exception, wenn die Umwandlung nach Integer nicht funktioniert. Das wurde aber vor 7,5 Jahren in diesem Thread schon festgestellt...

Gruß, noisefloor
Antworten