Frage zum Stil: while true und break

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
Miranda
User
Beiträge: 9
Registriert: Sonntag 23. September 2018, 21:45

Mittwoch 26. September 2018, 09:19

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?
__deets__
User
Beiträge: 4020
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mittwoch 26. September 2018, 09:24

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)
Sirius3
User
Beiträge: 8805
Registriert: Sonntag 21. Oktober 2012, 17:20

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.

@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.
__deets__
User
Beiträge: 4020
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mittwoch 26. September 2018, 10:19

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.
Benutzeravatar
__blackjack__
User
Beiträge: 1588
Registriert: Samstag 2. Juni 2018, 10:21

Mittwoch 26. September 2018, 10:56

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'))

Code: Alles auswählen

    **** COMMODORE 64 BASIC V2 ****
 64K RAM SYSTEM  38911 BASIC BYTES FREE
   CYBERPUNX RETRO REPLAY 64KB - 3.8P
READY.
█
Miranda
User
Beiträge: 9
Registriert: Sonntag 23. September 2018, 21:45

Mittwoch 26. September 2018, 14:09

Vielen lieben Dank für Eure nette Hilfe!

Ihr seid echt super :!: :!: :!:
Antworten