Seite 1 von 1
while Schleife
Verfasst: Dienstag 13. August 2013, 22:26
von jonse96
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")
Re: while Schleife
Verfasst: Dienstag 13. August 2013, 22:45
von 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.
Re: while Schleife
Verfasst: Dienstag 13. August 2013, 22:48
von EyDu
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.
Re: while Schleife
Verfasst: Dienstag 13. August 2013, 23:01
von jonse96
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
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.
Re: while Schleife
Verfasst: Dienstag 13. August 2013, 23:11
von 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().
Re: while Schleife
Verfasst: Dienstag 13. August 2013, 23:15
von jonse96
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
