Seite 1 von 1
round()
Verfasst: Sonntag 23. August 2015, 10:58
von Dj-Chief
Hey Leute,
ich arbeite derzeit das Buch "Einstig in Python" durch und hänge da jetzt an der Funktion "round()" fest im anhängenden Code könnt ihr erkennen was ich damit bezwecken will. ich habe schon einiges probiert. doch immer wird die Schleife an den Anfang gesetzt. sobal ich round mit int austausche funktioniert alles wieder. warum nur bei round nicht :K
Code: Alles auswählen
fehler = 3
while == 3:
print("Ersten wert eingeben")
a = input()
try:
ra = round(a,3)
fehler = 0
except:
print("Oh, nein")
Re: round()
Verfasst: Sonntag 23. August 2015, 11:13
von BlackJack
@Dj-Chief: Dann nimm mal das ``try``/``except`` da raus und schau Dir an was da für eine Ausnahme auftritt. Das ist ein Grund warum man kein nacktes ``except`` ohne konkrete Angabe von Ausnahmen verwenden sollte: Das behandelt dann *alle* Ausnahmen, auch solche die man gar nicht erwartet hat, und die Fehlersuche wird deutlich schwieriger.
Re: round()
Verfasst: Sonntag 23. August 2015, 11:32
von Dj-Chief
Ich würde halt nur gerne ne stelle haben bei der Fehler abgefangen werden. gibt es da noch andere wege?
Re: round()
Verfasst: Sonntag 23. August 2015, 11:41
von Sirius3
@Dj-Chief: Programmierfehler willst Du nicht abfangen sondern korrigieren. Zur Fehlerbehandlung mußt Du Dir überlegen, wo welche Fehler auftreten könnten und dann nur diese Fehler behandeln.
Re: round()
Verfasst: Sonntag 23. August 2015, 11:41
von BlackJack
@Dj-Chief: Du willst doch aber nur das bestimmte Ausnahmen abgefangen werden und zwar solche die Du erwartest und bei denen es Sinn macht weiter zu machen. Hier liegt ein Programmiererfehler vor, den möchtest Du *sehen* damit Du weisst welcher das ist, damit Du ihn beheben kannst. Die Fehlerbehandlung hier ist sowieso für die Tonne denn was nützt es dem Benutzer wenn das Programm 'Oh, nein' ausgibt und er keine Ahnung hat *warum*?
Mal so nebenbei ist das sicher nicht der tatsächliche Quelltext, denn dieser enthält einen Syntaxfehler, läuft also gar nicht erst.
Die `fehler`-Variable sollte wenn schon einen Wahrheitswert enthalten und nicht 0 oder 3 (wie kommt man auf diese Werte?), aber noch besser wäre eine ”Endlosschleife” (``while True:``) die im Erfolgsfall mit ``break`` verlassen wird.
Re: round()
Verfasst: Sonntag 23. August 2015, 11:44
von Dj-Chief
Nur tut sich da das Problem auf, wie fange ich fehler ab. ach und wo ist da ein syntax Fehler?
Re: round()
Verfasst: Sonntag 23. August 2015, 11:50
von BlackJack
@Dj-Chief: Der Syntaxfehler ist da wo der Compiler darüber meckert wenn man den Quelltext aus Deinem ersten Beitrag versucht auszuführen:
Code: Alles auswählen
$ python forum4.py
File "forum4.py", line 2
while == 3:
^
SyntaxError: invalid syntax
Eingerückt wird per Konvention übrigens vier Leerzeichen pro Ebene. Das solltest Du in Deinem Editor einstellen.
Ausnahmen behandelt man mit ``except``, aber eben nur solche die man erwartet und mit einer Behandlung die *Sinn* macht. Wenn man eine Ausnahme nicht sinnvoll behandeln kann, dann sollte man es bleiben lassen.
Re: round()
Verfasst: Sonntag 23. August 2015, 11:52
von Dj-Chief
gut ja da habe ich was vergessen,
while fehler == 0,
so heißt es im orginal
Re: round()
Verfasst: Sonntag 23. August 2015, 11:56
von Dj-Chief
ach im übrigen es ist am ende ein simpler Taschenrechner der auf dem Terminal Basiert und da will ich einen Programmabbruch durch Fehleingabe verhindern
Re: round()
Verfasst: Sonntag 23. August 2015, 12:05
von Sirius3
will man Fehleingaben abfangen, prüft man die Eingabe und versucht nicht, irgendwann später mögliche Ausnahmen zu behandeln.
Re: round()
Verfasst: Sonntag 23. August 2015, 12:05
von cofi
Ich rate mal: Du benutzt Python3. In dem Fall ist der Rueckgabewert von `input` ein String (wie auch bei `raw_input`, das du bei Python2 benutzen solltest).
Was passiert, wenn du `round` auf einen String anwendest?
Code: Alles auswählen
In [1]: round("00", 3)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-1-eb1c06e2c895> in <module>()
----> 1 round("00", 3)
TypeError: a float is required
_Das_ ist der Fehler, den die anderen dir Zeigen wollten.
Und so sieht es aus, wenn die Fehlerbehandlung an der richtigen Stelle ist:
Code: Alles auswählen
while True:
a = input("Wert eingegeben")
try:
number = float(a)
except ValueError:
print("Fliesspunktzahl noetig!")
continue
ra = round(a,3)
break
Re: round()
Verfasst: Sonntag 23. August 2015, 12:06
von Dj-Chief
Gut soweit bin ich noch nicht muss mich wohl noch gedulden
Re: round()
Verfasst: Sonntag 23. August 2015, 12:16
von Dj-Chief
so den Ablauf habe ich verstanden nur habe ich einige Begriffe noch nicht verstanden zum einen wandelt float(a) die eingabe in eine Fliespunktzahl um? und zum anderen was hat es mit dem ValueError auf sich?
Re: round()
Verfasst: Sonntag 23. August 2015, 12:17
von Sirius3
@cofi: yup, und den Fehler in Deinem Code ist gleich als Übung gedacht, um das gelernte anzuwenden. Mit continue sollte man sehr sparsam umgehen, da man oft am Ende einer Schleife etwas hinzufügt und sich dann wundert, warum das nicht immer ausgeführt wird. Ein break als letzter Befehl, der immer ausgeführt wird ist auch exotisch. Was soll denn die Schleife machen?: so lange die Eingabe wiederholen, bis eine Zahl eingegeben wurde. Um am besten nur das:
Code: Alles auswählen
while True:
try:
a = float(input("Wert eingeben"))
break
except ValueError:
print("Keine Zahl eingegeben!")
ra = round(a, 3)
Re: round()
Verfasst: Sonntag 23. August 2015, 12:26
von Dj-Chief
Vielen Dank Sirius3 Dein Code hat mir sehr geholfen und ich habe was dazu gelernt vielen Dank
Re: round()
Verfasst: Sonntag 23. August 2015, 15:48
von cofi
@Sirius3: Genau

Das passiert eben wenn man den Ausgangscode nimmt und ihn an moeglichst wenigen Stellen veraendern will, damit man den Uebergang noch sieht
