Anfängerproblem bei Usereingaben
-
- User
- Beiträge: 42
- Registriert: Samstag 11. Juli 2009, 16:36
Hallo,
ich beschäftige mich erst seit ein paar Tagen mit Python 3.1 und Programmierung überhaupt. Ich habe mich etwas eingelesen und möchte ein Modul schreiben, welches mir Nutzereingaben filtert, also bspw.
nur integer-Zahlen erlaubt und bei Eingabe eines strings eine Fehlermeldung an den Nutzer ausgibt und die erneute Eingabe ermöglicht.
Und daran scheitere ich schon
Ich habe verschiedenste Anläufe versucht, aber keiner funktioniert (aus mir unerklärlichen Gründen )
Vielleicht könnte mir jemand von euch nur skizzieren, wie man so eine triviale Aufgabe löst; nur ein, zwei Stichpunkte, mit welchen Befehlen, etc.
merci.
ich beschäftige mich erst seit ein paar Tagen mit Python 3.1 und Programmierung überhaupt. Ich habe mich etwas eingelesen und möchte ein Modul schreiben, welches mir Nutzereingaben filtert, also bspw.
nur integer-Zahlen erlaubt und bei Eingabe eines strings eine Fehlermeldung an den Nutzer ausgibt und die erneute Eingabe ermöglicht.
Und daran scheitere ich schon
Ich habe verschiedenste Anläufe versucht, aber keiner funktioniert (aus mir unerklärlichen Gründen )
Vielleicht könnte mir jemand von euch nur skizzieren, wie man so eine triviale Aufgabe löst; nur ein, zwei Stichpunkte, mit welchen Befehlen, etc.
merci.
Woran genau scheiterst du?
Ein mögliche Vorgehensweise wäre:
Ein mögliche Vorgehensweise wäre:
Code: Alles auswählen
Eingabe_richtig := Nein
SOLANGE NICHT Eingabe_richtig:
Eingabe := Nutzereingabe
WENN Eingabe IST Zahl:
Eingabe_richtig := Ja
ANDERNFALLS:
drucke Fehlermeldung
Code: Alles auswählen
raw_input()
Code: Alles auswählen
print "25".isdigit()
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Ja, anders in 3.x. Dort ist es ``input``.problembär hat geschrieben:(Oder anders in 3.1?)Code: Alles auswählen
raw_input()
- noisefloor
- User
- Beiträge: 3856
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
wandel doch die Eingabe (=immer String, wie oben steht) in ein Interger
Wenn's einen Fehler wirf war es kein Integer.
Nachteil: Wenn ein Float eingegeben wird gibt's auch keinen Fehler.
Gruß, noisefloor
wandel doch die Eingabe (=immer String, wie oben steht) in ein Interger
Code: Alles auswählen
Eingabe = int(Eingabe)
Nachteil: Wenn ein Float eingegeben wird gibt's auch keinen Fehler.
Gruß, noisefloor
-
- User
- Beiträge: 42
- Registriert: Samstag 11. Juli 2009, 16:36
Ja, aber genau das soll nicht passieren, die falsche Eingabe soll vom Programm abgefangen werden.noisefloor hat geschrieben:Wenn's einen Fehler wirf war es kein Integer.Code: Alles auswählen
Eingabe = int(Eingabe)
Ich habe so was wie
Code: Alles auswählen
eingabe = int (eingabe)
if int (eingabe) == False
print ("Eingabe kein Integer")
Code: Alles auswählen
eingabe = int (eingabe)
if type (eingabe) != type (1)
print ("Eingabe kein Integer")
Code: Alles auswählen
eingabe = int (eingabe)
Die Frage anders formuliert:
>>>Es muss doch einen trivialen Weg geben, abzufragen, ob ein Eingabe-string (hypothetisch) in eine integer oder float umzuwandeln geht(?)
oder ist der Weg über "input" schon falsch, gibt es noch andere Möglichkeiten der Nutzereingabe?
DasIch hat deine Frage doch schon beantwortet:
Code: Alles auswählen
>>> try:
... int("spam")
... except ValueError:
... print "not an integer"
...
not an integer
Das Leben ist wie ein Tennisball.
Ich steh' nicht so auf "try: .... except: ...". Deshalb hatte ich oben vorgeschlagen:
Für float müßtest Du dann halt einen regulären Ausdruck basteln.
Type prüft man übrigens:
Nur kommt von input() eben immer "str" zurück.
Gruß
Code: Alles auswählen
a = input()
if a.isdigit():
a = int(a)
Type prüft man übrigens:
Code: Alles auswählen
if type(a) == int:
print "Is int."
Gruß
-
- User
- Beiträge: 221
- Registriert: Sonntag 1. Juni 2008, 09:08
Code: Alles auswählen
def isPossibleInt(data):
return (data.isdigit() or (data.count(".") == 1 and data.replace(".", "").isdigit()))
Grüßle.
@problembär: try-except ist der pythonische Weg. Eigene Prüfungen zu entwickeln ist vollkommen überflüssig und fehleranfällig (siehe Chrisbers Code).
Typen prüft man nicht mit "type" sondern mit "isinstance". Am besten aber nirgends explizit.
@Chrisber:
- Der Methodenname passt nicht ganz zu dem Inhalt
- Deine Funktion kann man kürzer schreiben:
- Sie funktioniert nicht mit "10e3"
Typen prüft man nicht mit "type" sondern mit "isinstance". Am besten aber nirgends explizit.
@Chrisber:
- Der Methodenname passt nicht ganz zu dem Inhalt
- Deine Funktion kann man kürzer schreiben:
Code: Alles auswählen
def is_possible_float(data):
return data.count(".") <=1 and data.replace(".", "").isdigit()
Das Leben ist wie ein Tennisball.
- noisefloor
- User
- Beiträge: 3856
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
Besser als
geht's ja wohl nicht. Und man kann sicher sein, dass es funktioniert.
Gruß, noisefloor
So isses, warum das Rad neu erfinden.try-except ist der pythonische Weg.
Besser als
Code: Alles auswählen
ein = input()
try:
ein = int(ein)
except ValueError:
print 'Fehler'
Gruß, noisefloor
-
- User
- Beiträge: 42
- Registriert: Samstag 11. Juli 2009, 16:36
Danke an alle Antworter!
Ich werde es mit try... except versuchen, habe mich da schon etwas eingelesen.
Ich werde es mit try... except versuchen, habe mich da schon etwas eingelesen.
- birkenfeld
- Python-Forum Veteran
- Beiträge: 1603
- Registriert: Montag 20. März 2006, 15:29
- Wohnort: Die aufstrebende Universitätsstadt bei München
[quote="problembär]
Type prüft man übrigens:
[/quote]
Nein! Wenn, dann ``type(a) is int``, aber in 90% aller Fälle ``isinstance(a, int)``.
Type prüft man übrigens:
Code: Alles auswählen
if type(a) == int:
print "Is int."
Nein! Wenn, dann ``type(a) is int``, aber in 90% aller Fälle ``isinstance(a, int)``.
Zeig' doch bitte mal ein Beispiel, in dem das mit dem Konstrukt, das ich genannt habe, nicht funktioniert.birkenfeld hat geschrieben:Nein!
Gruß
Dein Konstrukt macht Vererbung kaputt.problembär hat geschrieben:Zeig' doch bitte mal ein Beispiel, in dem das mit dem Konstrukt, das ich genannt habe, nicht funktioniert.
Code: Alles auswählen
class MyInt(int): pass
type(MyInt(1)) is int
problembär hat geschrieben:Zeig' doch bitte mal ein Beispiel, in dem das mit dem Konstrukt, das ich genannt habe, nicht funktioniert.birkenfeld hat geschrieben:Nein!
Code: Alles auswählen
>>> class Int(object):
... class __metaclass__(type):
... def __eq__(self, other):
... return issubclass(other, int)
...
>>> a = Int()
>>> type(a) == int
True
>>> type(a) is int
False
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
-
- User
- Beiträge: 42
- Registriert: Samstag 11. Juli 2009, 16:36
so, hab jetzt was gebastelt, was so funktioniert, wie ich mir das vorgestellt habe:
Mit diesem Testscript kann man das Modul testen:
Meinungen/Kritik sind natürlich willkommen, ich will ja dazulernen.
Man kann an das Modul einen beliebigen String und die dazugehörige Nutzereingabe übergeben. Der Wert wird dann geprüft.input_check.py hat geschrieben:Code: Alles auswählen
#---------Überprüft, ob eine Nutzereingabe vom Typ int ist------------- #Parameter "string": #Der Text, mit dem der Nutzer aufgefordert wird, seine Eingabe zu machen #Parameter "wert": #Die Nutzereingabe, die von int_check geprüft werden soll #------------------------------------------------------------------ def int_check (string, wert): fehler = 1 while fehler == 1: try: wert = int (wert) fehler = 0 return wert except: print ("FEHLER: erwartet Ganzzahl") print ("") wert = input (string)
Mit diesem Testscript kann man das Modul testen:
Auch wenn das für euch Kindergeburtstag ist - ich bin mächtig stolz auf michtest.py hat geschrieben:Code: Alles auswählen
#Testscript, das 3 Nutzereingaben an das Modul input_check #übergibt und dann die Summe bildet import input_check x1 = ("1. Wert eingeben: ") y1 = input (x1) z1 = input_check.int_check (x1, y1) x2 = ("2. Wert eingeben: ") y2 = input (x2) z2 = input_check.int_check (x2, y2) x3 = ("3. Wert eingeben: ") y3 = input (x3) z3 = input_check.int_check (x3, y3) summe = z1 + z2 + z3 print ("\nEs wurde \n\nx1 = {0}\nx2 = {1}\nx3 = {2}\n\neingegeben".format (z1, z2, z3)) print ("\nDie Summe ist: {0}".format (summe))
Meinungen/Kritik sind natürlich willkommen, ich will ja dazulernen.