Seite 1 von 3
Anfängerproblem bei Usereingaben
Verfasst: Samstag 11. Juli 2009, 17:20
von AntagonisT
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.
Verfasst: Samstag 11. Juli 2009, 17:45
von Darii
Woran genau scheiterst du?
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
Verfasst: Samstag 11. Juli 2009, 18:09
von problembär
(Oder anders in 3.1?) Die Funktion gibt IMMER Strings zurück.
Gruß
Verfasst: Samstag 11. Juli 2009, 18:20
von cofi
problembär hat geschrieben:
(Oder anders in 3.1?)
Ja, anders in 3.x. Dort ist es ``input``.
Verfasst: Samstag 11. Juli 2009, 20:45
von noisefloor
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
Verfasst: Samstag 11. Juli 2009, 20:48
von DasIch
noisefloor hat geschrieben:Nachteil: Wenn ein Float eingegeben wird gibt's auch keinen Fehler.
Zumindest bei mir gibt es einen ValueError.
Verfasst: Samstag 11. Juli 2009, 21:32
von gkuhl
Weil die "string representation" einer Float nicht umgewandelt werden kann.
Verfasst: Samstag 11. Juli 2009, 22:02
von AntagonisT
noisefloor hat geschrieben:
Wenn's einen Fehler wirf war es kein Integer.
Ja, aber genau das soll nicht passieren, die falsche Eingabe soll vom Programm abgefangen werden.
Ich habe so was wie
Code: Alles auswählen
eingabe = int (eingabe)
if int (eingabe) == False
print ("Eingabe kein Integer")
oder
Code: Alles auswählen
eingabe = int (eingabe)
if type (eingabe) != type (1)
print ("Eingabe kein Integer")
versucht, aber das Problem tritt ja schon auf, wenn ich
schreibe und "eingabe" definitv ein string ist.
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?
Verfasst: Samstag 11. Juli 2009, 22:06
von EyDu
DasIch hat deine Frage doch schon beantwortet:
Code: Alles auswählen
>>> try:
... int("spam")
... except ValueError:
... print "not an integer"
...
not an integer
Verfasst: Sonntag 12. Juli 2009, 00:30
von problembär
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ß
Verfasst: Sonntag 12. Juli 2009, 02:20
von theliquidwave
Code: Alles auswählen
def isPossibleInt(data):
return (data.isdigit() or (data.count(".") == 1 and data.replace(".", "").isdigit()))
~ Chris
Verfasst: Sonntag 12. Juli 2009, 08:37
von BlackJack
Verfasst: Sonntag 12. Juli 2009, 08:42
von EyDu
@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:
Code: Alles auswählen
def is_possible_float(data):
return data.count(".") <=1 and data.replace(".", "").isdigit()
- Sie funktioniert nicht mit "10e3"
Verfasst: Sonntag 12. Juli 2009, 17:05
von noisefloor
Hallo,
try-except ist der pythonische Weg.
So isses, warum das Rad neu erfinden.
Besser als
Code: Alles auswählen
ein = input()
try:
ein = int(ein)
except ValueError:
print 'Fehler'
geht's ja wohl nicht. Und man kann sicher sein, dass es funktioniert.
Gruß, noisefloor
Verfasst: Sonntag 12. Juli 2009, 17:44
von AntagonisT
Danke an alle Antworter!
Ich werde es mit try... except versuchen, habe mich da schon etwas eingelesen.
Verfasst: Montag 13. Juli 2009, 22:04
von birkenfeld
[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)``.
Verfasst: Dienstag 14. Juli 2009, 01:14
von problembär
birkenfeld hat geschrieben:Nein!
Zeig' doch bitte mal ein Beispiel, in dem das mit dem Konstrukt, das ich genannt habe, nicht funktioniert.
Gruß
Verfasst: Dienstag 14. Juli 2009, 01:50
von DasIch
problembär hat geschrieben:Zeig' doch bitte mal ein Beispiel, in dem das mit dem Konstrukt, das ich genannt habe, nicht funktioniert.
Dein Konstrukt macht Vererbung kaputt.
Mal abgesehen davon dass man mit Typ Überprüfungen duck typing nicht gerade erleichtert.
Verfasst: Dienstag 14. Juli 2009, 06:11
von Trundle
problembär hat geschrieben:birkenfeld hat geschrieben:Nein!
Zeig' doch bitte mal ein Beispiel, in dem das mit dem Konstrukt, das ich genannt habe, nicht funktioniert.
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
@DasIch: Deswegen hat er doch ``==`` benutzt *scnr*.
Verfasst: Freitag 17. Juli 2009, 19:02
von AntagonisT
so, hab jetzt was gebastelt, was so funktioniert, wie ich mir das vorgestellt habe:
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)
Man kann an das Modul einen beliebigen String und die dazugehörige Nutzereingabe übergeben. Der Wert wird dann geprüft.
Mit diesem Testscript kann man das Modul testen:
test.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))
Auch wenn das für euch Kindergeburtstag ist - ich bin mächtig stolz auf mich
Meinungen/Kritik sind natürlich willkommen, ich will ja dazulernen.