Anfängerproblem bei Usereingaben

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.
AntagonisT
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 :oops:

Ich habe verschiedenste Anläufe versucht, aber keiner funktioniert (aus mir unerklärlichen Gründen :lol: )

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.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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
problembär

Code: Alles auswählen

raw_input()
(Oder anders in 3.1?) Die Funktion gibt IMMER Strings zurück.

Code: Alles auswählen

print "25".isdigit()
Gruß
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

problembär hat geschrieben:

Code: Alles auswählen

raw_input()
(Oder anders in 3.1?)
Ja, anders in 3.x. Dort ist es ``input``.
Benutzeravatar
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

Code: Alles auswählen

Eingabe = int(Eingabe)
Wenn's einen Fehler wirf war es kein Integer.

Nachteil: Wenn ein Float eingegeben wird gibt's auch keinen Fehler.

Gruß, noisefloor
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

noisefloor hat geschrieben:Nachteil: Wenn ein Float eingegeben wird gibt's auch keinen Fehler.
Zumindest bei mir gibt es einen ValueError.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Weil die "string representation" einer Float nicht umgewandelt werden kann.
AntagonisT
User
Beiträge: 42
Registriert: Samstag 11. Juli 2009, 16:36

noisefloor hat geschrieben:

Code: Alles auswählen

Eingabe = int(Eingabe)
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

Code: Alles auswählen

eingabe = int (eingabe)
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?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
problembär

Ich steh' nicht so auf "try: .... except: ...". Deshalb hatte ich oben vorgeschlagen:

Code: Alles auswählen

a = input()
if a.isdigit():
    a = int(a)
Für float müßtest Du dann halt einen regulären Ausdruck basteln.

Type prüft man übrigens:

Code: Alles auswählen

if type(a) == int:
    print "Is int."
Nur kommt von input() eben immer "str" zurück.

Gruß
theliquidwave
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()))
~ Chris
Grüßle.
BlackJack

Code: Alles auswählen

In [35]: isPossibleInt('42.23')
Out[35]: True
Naja…
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

@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"
Das Leben ist wie ein Tennisball.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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. :wink:

Gruß, noisefloor
AntagonisT
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.
Benutzeravatar
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:

Code: Alles auswählen

if type(a) == int:
    print "Is int."
[/quote]

Nein! Wenn, dann ``type(a) is int``, aber in 90% aller Fälle ``isinstance(a, int)``.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
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ß
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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.

Code: Alles auswählen

class MyInt(int): pass
type(MyInt(1)) is int
Mal abgesehen davon dass man mit Typ Überprüfungen duck typing nicht gerade erleichtert.
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

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*.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
AntagonisT
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:
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 :P

Meinungen/Kritik sind natürlich willkommen, ich will ja dazulernen.
Antworten