2010-07-18 6 views
10

Ich habe eine for-Schleife, die eine Reihe von Bedingungen überprüft. Bei jeder Iteration sollte die Ausgabe nur für eine der Bedingungen erfolgen. Die Endausbeute ist ein Standardwert, falls keine der Bedingungen zutrifft. Muss ich einen setzen fortfahren nach jedem Block der Erträge?Bedeutet python rendrate weiter?

def function(): 
    for ii in aa: 
     if condition1(ii): 
      yield something1 
      yield something2 
      yield something3 
      continue 

     if condition2(ii): 
      yield something4 
      continue 

     #default 
     yield something5 
     continue 

Antwort

14

Statt die continue Erklärung der Verwendung würde ich vorschlagen, die elif und else statments mit:

def function(): 
    for ii in aa: 
     if condition1(ii): 
      yield something1 
      yield something2 
      yield something3 

     elif condition2(ii): 
      yield something4 

     else: #default 
      yield something5 

Diese

13

NO mir viel besser lesbar scheint, Ausbeute bedeutet nicht weiter, Es beginnt erst beim nächsten Mal in der nächsten Zeile. Ein einfaches Beispiel zeigt, dass

def f(): 
    for i in range(3): 
     yield i 
     print i, 

list(f()) 

Dies druckt 0,1,2 aber wenn Ertrag weiter, wird es nicht

1

continue überspringt den restlichen Code-Block, aber der Code-Block nach yield ausgeführt wird, wenn next() ist rief erneut am Generator an. yield wirkt wie die Ausführung an einem bestimmten Punkt anhalten.

8

yield in Python stoppt die Ausführung und gibt den Wert zurück. Wenn der Iterator erneut aufgerufen wird, wird die Ausführung direkt nach der yield-Anweisung fortgesetzt. Zum Beispiel definiert ein Generator als:

def function(): 
    yield 1 
    yield 2 

12 dann sequentiell zurückkehren würde. Mit anderen Worten, die continue ist erforderlich. In diesem Fall sind jedoch elif und else als flashk beschrieben definitiv die richtigen Werkzeuge.

0

Wenn das etwas einfacher Wert ist und die Bedingungen sind Kontrollen für die Gleichstellung, würde ich es vorziehen, um diese „Fall-Struktur“ Wörterbuchsuche zu machen:

ii_dict={'a':('somethinga1','somethinga2','somethinga3'),'b':('somethingb1',)} 
ii_default = ('somethingdefault',) 
aa='abeabbacd' 

def function(): 
    return (value 
      for ii in aa 
      for value in (ii_dict[ii] if ii in ii_dict else ii_default)) 

for something in function(): print something