Ich bin ein großer Fan von Pythons für ... andere Syntax - Es ist überraschend, wie oft es anwendbar ist und wie effektiv es Code vereinfachen kann.
Ich habe jedoch keine gute Möglichkeit gefunden, es in einem Generator zu verwenden, zum Beispiel:
%Vor% Im obigen Beispiel möchte ich, dass die print
-Anweisung nur dann ausgeführt wird, wenn i
leer ist. Da else
jedoch nur break
und return
berücksichtigt, wird sie immer ausgeführt, unabhängig von der Länge von i
.
Wenn es unmöglich ist, for...else
auf diese Weise zu verwenden, was ist der beste Ansatz dafür, dass die Anweisung print
nur ausgeführt wird, wenn nichts zurückgegeben wird?
Sie brechen die Definition eines Generators, der nach Abschluss der Iteration eine StopIteration-Ausnahme auslösen sollte (was automatisch durch eine return-Anweisung in einer Generatorfunktion behandelt wird)
Also:
%Vor%Am besten lässt der aufrufende Code den Fall eines leeren Iterators behandeln:
%Vor%Könnte ein saubererer Weg sein, um das oben genannte zu tun, aber das sollte gut funktionieren und fällt nicht unter die üblichen Fallen, die einen Iterator wie eine Liste behandeln, unten.
Wie Sie feststellen, erkennt for..else
nur break
. Es ist also nur anwendbar, wenn Sie nach etwas suchen und dann stop .
Es ist nicht auf Ihren Zweck anwendbar, nicht weil es ein Generator ist, sondern , weil Sie alle Elemente verarbeiten möchten, ohne zu stoppen (weil Sie alle ausgeben wollen, aber das ist nicht der Punkt).
Also Generator oder nicht, Sie brauchen wirklich einen booleschen, wie in Bers Lösung.
Wenn es unmöglich ist, für ... sonst auf diese Weise zu verwenden, was ist der beste Ansatz dafür, dass die print-Anweisung nur ausgeführt wird, wenn nichts zurückgegeben wird?
Maximal kann ich Folgendes denken:
%Vor%