Verwendung von for ... sonst in Python-Generatoren

7

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?

    
James Brady 02.03.2009, 19:28
quelle

6 Antworten

11

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.

    
Triptych 02.03.2009, 19:32
quelle
5

Es gibt mehrere Möglichkeiten, dies zu tun. Sie könnten immer Iterator direkt verwenden:

%Vor%

Aber wenn Sie mehr darüber wissen, was Sie von dem Argument i erwarten können, können Sie prägnanter sein:

%Vor%     
Chris B. 02.03.2009 19:44
quelle
3

Wenn man einige der früheren Antworten zusammenfasst, könnte man das so lösen:

%Vor%

Es gibt also keine "else" -Klausel.

    
Ber 02.03.2009 20:45
quelle
3

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.

    
Beni Cherniavsky-Paskin 31.12.2009 13:43
quelle
0
  
    

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%     
Mykola Kharechko 02.03.2009 20:16
quelle
-2

Was ist mit einfachem if-else?

%Vor%     
Martin Janiczek 02.03.2009 19:36
quelle