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
jonse96
User
Beiträge: 3
Registriert: Dienstag 13. August 2013, 22:20

Hey Leute,
mal ne kurze Frage.
Hier ein kleines Programm zum Bestimmen der Lösungen einer Funktion 2. Grades.
Wollte nur wissen ob die while-Schleife in der Funktion einlesen nicht anders zu handhaben ist, denn die sieht irgendwie nach eher schlechtem Programmierstil aus, da ich "u" ja irgendwie bezeichnen könnte (und die Schleife dann angleichen müsste).
Gruß jonse96

Code: Alles auswählen

def einlesen(name):
    # u einlesen
    u = "null"        
    while u == "null":
        print("Geben Sie", name,"an:")
        try:
            u = int(input())
        except:
            print("Fehlerhafte Eingabe")
    return u

# --------------------
# Hauptprogramm

# Ausgabe der Funktionsgleichung
print("f(x) = ax² + bx + c")

# a einlesen
a = einlesen("a")
print(a)

# b einlesen
b = einlesen("b")
print(b)

# c einlesen
c = einlesen("c")
print(c)

if(b * b - 4 * a * c < 0):  
    print("Die Gleichung %sx² + %sx + %s hat keine Lösung" % (a,b,c))
elif(b * b - 4 * a * c == 0):
    print("Eine Lösung")
else:
    print("Zwei Lösungen")
BlackJack

@jonse96: Das ist unnötig kompliziert. Man braucht `u` gar nicht. Einfach eine Endlosschleife mit ``while True:`` und dann in den ``try``-Block ``return int(input('Geben sie {0} an: '.format(name)))``.

Wenn man einen Namen für das Ergebnis braucht und einem kein guter Name einfällt, ist `result` übrigens allemal besser als ein nichtssagendes `u`.

Ansonsten möchte ich noch anmerken, dass weder ``if`` noch ``elif`` Funktionen sind, und man das auch nicht so schreiben sollte als wären es welche. Mindestens ein Leerzeichen gehört da vor die öffnende Klammer, wobei die Klammern an sich schon total überflüssig sind. Die würde man einfach weglassen.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Mit deiner Vermutung zum schlechten Stil liegst du richtig. Man würde es eher so machen:

Code: Alles auswählen

def einlesen(text):
    while True:
        try:
            return int(input(text))
        except ValueError:
            pass
Ganz allgemein gilt, dass du niemals ein except ohne die konkrete Ausnahme stehen haben solltest. Das bedeutet nämlich, das wirklich alle Fehler abgefangen werden. Da in Python die Namen (von Variablen) zur Leifzeit aufgelöst werden und ggf. eine Exception geworfen wird, könntest du damit Fehler verdecken. Die sind dann sehr schwer zu finden.

Auch solltest du vermeiden irgendwelche Strings zu definieren, welche dann für "kein Wert" stehen. Das ist meistens ein Hinweis darauf, dass ``None`` angebracht ist oder dass der Code umgestellt werden muss.

Im Prinzip kannst du die Funktion jetzt auch noch erweitern, so dass die Eingaben beliebig werden können:

Code: Alles auswählen

def einlesen(text, converter=int):
    while True:
        try:
            return converter(input(text))
        except ValueError:
            pass
``einlesen("spam")`` prüft dann auf Integer, ``einlesen("ham", float)`` hingegen auf Floats. Damit hast du dann eine sehr allgemeine Eingabefunktion.
Das Leben ist wie ein Tennisball.
jonse96
User
Beiträge: 3
Registriert: Dienstag 13. August 2013, 22:20

BlackJack hat geschrieben:@jonse96: Das ist unnötig kompliziert. Man braucht `u` gar nicht. Einfach eine Endlosschleife mit ``while True:`` und dann in den ``try``-Block ``return int(input('Geben sie {0} an: '.format(name)))``.

Wenn man einen Namen für das Ergebnis braucht und einem kein guter Name einfällt, ist `result` übrigens allemal besser als ein nichtssagendes `u`.

Ansonsten möchte ich noch anmerken, dass weder ``if`` noch ``elif`` Funktionen sind, und man das auch nicht so schreiben sollte als wären es welche. Mindestens ein Leerzeichen gehört da vor die öffnende Klammer, wobei die Klammern an sich schon total überflüssig sind. Die würde man einfach weglassen.
Erstmal danke für die schnelle Antwort.
deine Hinweise sind eigentlich alle einleuchtend, bis auf

Code: Alles auswählen

input('Geben sie {0} an: '.format(name))
Wozu dient diese .format. Einfach nur um den Platzhalter {0} mit "name" zu füllen?


@EyDu
Auch dir danke ich für die schnelle Antwort. Soweit auch keine weiteren Nachfragen, alles verständlich erklärt.
BlackJack

@jonse96: `format()` ist eine Methode auf Zeichenketten. Was die macht kann man in der Dokumentation nachlesen: str.format().
Java hat so etwas in der Richtung doch auch: java.String.format().
jonse96
User
Beiträge: 3
Registriert: Dienstag 13. August 2013, 22:20

BlackJack hat geschrieben:@jonse96: `format()` ist eine Methode auf Zeichenketten. Was die macht kann man in der Dokumentation nachlesen: str.format().
Java hat so etwas in der Richtung doch auch: java.String.format().
Danke, du hast völlig recht, habe das in Java auch verwendet :)
Antworten