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

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

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ß

Verfasst: Samstag 11. Juli 2009, 18:20
von cofi
problembär hat geschrieben:

Code: Alles auswählen

raw_input()
(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

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

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:

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?

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:

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ß

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

Code: Alles auswählen

In [35]: isPossibleInt('42.23')
Out[35]: True
Naja…

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

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:

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)``.

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.

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.

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 :P

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