2010-07-18 46 views
10

J'ai une boucle for qui vérifie une série de conditions. À chaque itération, il devrait produire une sortie pour une seule des conditions. Le rendement final est un défaut, dans le cas où aucune des conditions ne sont vraies. Dois-je mettre un continuer après chaque bloc de rendement?Est-ce que le rendement de python implique de continuer?

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 

Répondre

14

au lieu d'utiliser l'instruction continue Je suggère d'utiliser les elif et else statments:

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

     elif condition2(ii): 
      yield something4 

     else: #default 
      yield something5 

Cela me semble beaucoup plus lisible

13

NO, le rendement ne signifie pas continuer, ça commence juste à la prochaine ligne, la prochaine fois. Un exemple simple démontre que

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

list(f()) 

Cette imprime 0,1,2 mais si le rendement continue, il ne sera pas

1

continue Ignore le bloc de code restant, mais le bloc de code après yield est exécuté lorsque next() est appelé à nouveau sur le générateur. yield agit comme une pause d'exécution à un certain point.

8

yield en Python arrête l'exécution et renvoie la valeur. Lorsque l'itérateur est à nouveau appelé, il continue l'exécution directement après l'instruction yield. Par exemple, un générateur défini comme:

def function(): 
    yield 1 
    yield 2 

retourneraient 1 puis 2 séquentiellement. En d'autres termes, le continue est requis. Cependant, dans ce cas, elif et else comme flashk décrit sont certainement les bons outils.

0

Si quelque chose est simple valeur et les conditions sont les contrôles pour l'égalité, je préfère faire ce dictionnaire « structure de cas » recherche:

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