try, except und while Schleife

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.
Antworten
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Hallo und Mahlzeit!

Ist folgende Funktion sinnvoll (mit vordefiniertem Argument run=True), um zu erreichen, dass man bei fehlerhafter Eingabe (zb ein "a" statt einer Zahl) erneut die 2 geforderten Felder eingeben muss, oder geht das "schöner":

Code: Alles auswählen

def calc_it(run=True):
    while run == True:
        try:
            x = int(raw_input('Zahl 1:'))
            y = int(raw_input('Zahl 2:'))
            print 'Zahl 1:{}'.format(x), ' Zahl 2:{}'.format(y)
            run = False
        except ValueError:
            print 'Bitte eine Zahl angeben!'
Vielen Dank!

LG
Daniel
Zuletzt geändert von mcdaniels am Dienstag 19. Juni 2012, 12:33, insgesamt 3-mal geändert.
karolus
User
Beiträge: 145
Registriert: Samstag 22. August 2009, 22:34

Hallo

Code: Alles auswählen

def calc_it():
    while True:
        try:
            x = int(raw_input('Zahl 1:'))
            y = int(raw_input('Zahl 2:'))
            return 'Zahl 1:{} Zahl 2:{}'.format(x, y)
        except ValueError:
            print 'Bitte eine Zahl angeben!'
Karo
Zuletzt geändert von karolus am Dienstag 19. Juni 2012, 12:34, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

mcdaniels hat geschrieben: Ist folgende Funktion sinnvoll (mit vordefiniertem Argument run=True), um zu erreichen, dass man bei fehlerhafter Eingabe (zb ein "a" statt einer Zahl) erneut die 2 geforderten Felder eingeben muss, oder geht das "schöner":
Das geht auf jeden Fall schöner!

Code: Alles auswählen

def calc_it():
    while True:
        try:
            x = int(raw_input('Zahl 1:'))
            y = int(raw_input('Zahl 2:'))
            print 'Zahl 1:{} Zahl 2:{}'.format(x, y)
            return
        except ValueError:
            print 'Bitte eine Integer-Zahl angeben!'
Wobei ich den Namen der Funktion nicht sinnvoll finde - was wird denn da gerechnet? ;-)

Edit: Karo war schneller ;-) Aber dafür habe ich den `print`-Salat aufgeräumt und den Fehlertext präzisiert :-D
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Hallo,
vorweg danke für die beiden Varianten und für das Aufräumen des Printsalates (auch wenn gerade Mittagszeit ist :-) ).

Die Funktion ist momentan sinnbefreit, es ging mir nur um die while - Schleife.

LG
Daniel
Zuletzt geändert von mcdaniels am Dienstag 19. Juni 2012, 12:36, insgesamt 1-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Ein ganz klares jein ^^ Die Idee an sich ist schon korrekt, nur die Umsetzung ist nicht ganz so geschickt. Ich fange einfach mal von oben nach unten an:

Immer, wenn du ``x == True`` oder ``x == False`` schreibst, machst du einen kleinen Denkfehler. x ist bereits ein Wahrheitswert und muss nicht gegen einen anderen getestet werden. Ersteres ersetzt du also einfach durch ``x`` und letzteres durch ``not x``.

Dann hat die Zahlenabfrage noch ein Problem. Im Prinzip arbeitet der Ansatz ja korrekt, allerdings muss die erste Zahl auch dann noch einmal eingegeben werden, wenn die zweite Zahl nicht gültig ist. Die Funktion sollte also nur für eine einzige Eingabe ausgelegt sein. Du kannst dann ja zwei davon hintereinander schalten.

Weiter ist deine Formatierung total unsinning. Mit EINEM format-Aufruf kannst du die ganze Zeile zusammenfassen. Hier sieht es so aus, als hättest du irgendwann mal was von format gelesen und setzt es nun blind ein. Schau doch mal in die Dokumentation, die Formatierung ist ein recht mächtiges Werkzeug.

Abschließen ist noch das ``run = False`` überflüssig. Dies solltest du einfach durch ein ``break`` odr besser gleich ``return`` ersetzen, dann wird die Schleife ebenfalls verlassen. Aus der while-Schleife kannst du nun ein einfaches ``while True:`` machen.

Edit: fast vergessen: Natürlich solltest du in der Funktion zur Abfrage nichts berechnen. Schreibe eine Funktion zur Abfrage, eine Funktion für die Berechnung (welcher du die Eingaben als Parameter übergibst) und eine Funktion, welche die Abfragen durchführt und im Anschluss die Berechnung aufruft. Generell kannst du dir merken, dass du Eingabe/Ausgabe und Verarbeitung immer sauber trennen solltest.

Sebastian
Das Leben ist wie ein Tennisball.
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Danke EyDu,
format hab ich noch nicht solange intus (wobei es intus nicht korrekt beschreibt, sonst hätt ich das ja nicht so "salatmäßig" gelöst). Ich übe und übe, ob da draus dann mal ein Rad wird, weiß ich noch nicht. Wird halt einige Jahre? dauern, bis ich derartig unschönes Gemurkse selbstständig unterlasse... hoffe ich habe die dazu notwendige Ausdauer ;)

LG
Daniel
Antworten