Seite 1 von 1
Frage zum Stil: while true und break
Verfasst: Mittwoch 26. September 2018, 09:19
von Miranda
Hallo,
ich komme von eher klassischen Sprachen wie PHP oder Java.
Verstehe ich das richtig, dass es in Python üblich und sogar guter Ton ist, in eigentlich "unendlichen" while-Schleifen (while = True:) mit break zu arbeiten?!
Code: Alles auswählen
while True:
#mach irgend etwas
if zustand == erreicht
break
Ich kenne break natürlich von anderen Programmierpsrachen. Dass break aber so gezielt zur Steuerung eingesetzt wird mit "unendlichen" while-Schleifen habe ich aber in der Art noch nie gesehen.
Ich denke, wenn ich das bei meiner normalen Arbeit machen würde, würde ich gar nicht durch die Code-Review kommen.
Also meine konkrete Frage: In Python ist es üblich, bzw. gängige Praxis mit "unendlichen" Schleifen zu arbeiten und diese gezielt mit break zu verlassen?
Zweite Frage im direkten Zusammenhang:
Ein "break 2" gibt es offenbar nicht? Ich kann das also nur innerhalb _einer_ Schleife - und _nur_ für diese Schleife einsetzen?
Re: Frage zum Stil: while true und break
Verfasst: Mittwoch 26. September 2018, 09:24
von __deets__
Kurz gesagt: ja und ja
In anderen Sprachen hat man statt while oft auch do while, und damit erreicht man, was man hier mit dem break erreichen will: das der Code mindestens einmal ausgefuehrt wird, bevor eine Abbruchbedingung geprueft wird. In Java wuerde man dann eben do-while machen, etc.
Ein break mit mehreren Ebenen habe ich mir gelegentlich auch schon gewuenscht, aber oft kommt das eh nicht vor, und vieles laesst sich dann auch anders formulieren. So kannst du deine verschachtelte Schleife zB auch einfach in eine lokale Funktion auslagern, und dann mit return rausspringen:
Code: Alles auswählen
def foo():
def look_deep_and_possibly_abort(argument):
while condition:
for thing in something:
if thing.will_ich():
return thing
for candidate in candidates:
res = look_deep_and_possibly_abort()
if res is not None:
machwas(res)
Re: Frage zum Stil: while true und break
Verfasst: Mittwoch 26. September 2018, 10:02
von Sirius3
@__deets__: verschachtelte Funktionen haben keinen Vorteil gegenüber Funktionen auf oberster Ebene, außer dass man sich das Testen erschwert.
@Miranda: wie __deets__ schon geschrieben hat, haben andere Sprachen Schleifen mit End-Bedingung statt Anfangsbedingung. Aber auch diese Sprachen haben kein Konstrukt, wenn sich die Bedingung erst in der Mitte ergibt:
Code: Alles auswählen
werte = []
while True:
wert = tuwas()
if wert == 'ENDE':
break
werte.append(wert)
Das kann man in Python zwar mit Generatoren oder ähnlichem eleganter schreiben, in PHP oder Java sind solche Dinge aber durchaus alternativlos nötig.
Ein `break 2` gibt es in Python absichtlich nicht, aus dem selben Grund, warum es in anderen Sprachen nicht benutzt werden sollte, es macht den Code unlesbar. Zu tiefe Verschachtelung löst man am besten mit mehr Funktionen.
Re: Frage zum Stil: while true und break
Verfasst: Mittwoch 26. September 2018, 10:19
von __deets__
Sirius3 hat geschrieben: Mittwoch 26. September 2018, 10:02
@__deets__: verschachtelte Funktionen haben keinen Vorteil gegenüber Funktionen auf oberster Ebene, außer dass man sich das Testen erschwert.
Wie immer sehr absolut gesprochen. Auch wenn es nur deine Meinung ist.... und ich sie nicht teile. Den Modulnamensraum mit trivialen und eigentlich privaten Funktionen zuzuballern, die auch noch mehr Argumente als noetig explizit uebergeben bekommen muessen, statt als closure diverse Namen einfach zu kennen, ist fuer mich ein Vorteil, der deinem so-und-nicht-anders Ansatz gegenueber abzuwaegen ist. Das testbarkeit wichtig ist, und zu grosse Funktionen zu vermeiden, ist eine orthogonale Diskussion.
Re: Frage zum Stil: while true und break
Verfasst: Mittwoch 26. September 2018, 10:56
von __blackjack__
Um die Anmerkung von Sirius3 das man das mit Generatoren oder ähnlichem eleganter schreiben kann, mit ein wenig Code zu unterfüttern, hier in zwei Schritten zu einem Einzeiler umgeformt:
Code: Alles auswählen
werte = []
while True:
wert = tuwas()
if wert == 'ENDE':
break
werte.append(wert)
# ->
werte = []
for wert in iter(tuwas, 'ENDE'):
werte.append(wert)
# ->
werte = list(iter(tuwas, 'ENDE'))
Re: Frage zum Stil: while true und break
Verfasst: Mittwoch 26. September 2018, 14:09
von Miranda
Vielen lieben Dank für Eure nette Hilfe!
Ihr seid echt super
