round()

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
Dj-Chief
User
Beiträge: 13
Registriert: Sonntag 23. August 2015, 10:43
Wohnort: FST

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")
Ja, Gott ist meine Rettung; ihm will ich vertrauen und niemals verzagen
Jesaja 12,2
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.
Dj-Chief
User
Beiträge: 13
Registriert: Sonntag 23. August 2015, 10:43
Wohnort: FST

Ich würde halt nur gerne ne stelle haben bei der Fehler abgefangen werden. gibt es da noch andere wege?
Ja, Gott ist meine Rettung; ihm will ich vertrauen und niemals verzagen
Jesaja 12,2
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
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.
Dj-Chief
User
Beiträge: 13
Registriert: Sonntag 23. August 2015, 10:43
Wohnort: FST

Nur tut sich da das Problem auf, wie fange ich fehler ab. ach und wo ist da ein syntax Fehler?
Ja, Gott ist meine Rettung; ihm will ich vertrauen und niemals verzagen
Jesaja 12,2
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.
Dj-Chief
User
Beiträge: 13
Registriert: Sonntag 23. August 2015, 10:43
Wohnort: FST

gut ja da habe ich was vergessen,
while fehler == 0,
so heißt es im orginal
Ja, Gott ist meine Rettung; ihm will ich vertrauen und niemals verzagen
Jesaja 12,2
Dj-Chief
User
Beiträge: 13
Registriert: Sonntag 23. August 2015, 10:43
Wohnort: FST

ach im übrigen es ist am ende ein simpler Taschenrechner der auf dem Terminal Basiert und da will ich einen Programmabbruch durch Fehleingabe verhindern
Ja, Gott ist meine Rettung; ihm will ich vertrauen und niemals verzagen
Jesaja 12,2
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

will man Fehleingaben abfangen, prüft man die Eingabe und versucht nicht, irgendwann später mögliche Ausnahmen zu behandeln.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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
Dj-Chief
User
Beiträge: 13
Registriert: Sonntag 23. August 2015, 10:43
Wohnort: FST

Gut soweit bin ich noch nicht muss mich wohl noch gedulden
Ja, Gott ist meine Rettung; ihm will ich vertrauen und niemals verzagen
Jesaja 12,2
Dj-Chief
User
Beiträge: 13
Registriert: Sonntag 23. August 2015, 10:43
Wohnort: FST

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?
Ja, Gott ist meine Rettung; ihm will ich vertrauen und niemals verzagen
Jesaja 12,2
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@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)
Dj-Chief
User
Beiträge: 13
Registriert: Sonntag 23. August 2015, 10:43
Wohnort: FST

Vielen Dank Sirius3 Dein Code hat mir sehr geholfen und ich habe was dazu gelernt vielen Dank
Ja, Gott ist meine Rettung; ihm will ich vertrauen und niemals verzagen
Jesaja 12,2
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

@Sirius3: Genau ;) Das passiert eben wenn man den Ausgangscode nimmt und ihn an moeglichst wenigen Stellen veraendern will, damit man den Uebergang noch sieht :(
Antworten