2010-07-18 14 views
10

Tengo un bucle for que verifica una serie de condiciones. En cada iteración, debe producir resultados solo para una de las condiciones. El rendimiento final es un valor predeterminado, en caso de que ninguna de las condiciones sea verdadera. ¿Tengo que poner continuar después de cada bloque de rendimientos?¿El rendimiento de python implica continuar?

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 

Respuesta

14

En lugar de utilizar la instrucción continue se recomienda usar los elif y 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 

esto parece mucho más legible para mí

13

NO, el rendimiento no implica continuar, solo comienza en la próxima línea, la próxima vez. Un simple ejemplo demuestra que

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

list(f()) 

Esto imprime 0,1,2 pero si el rendimiento sigue, no se

1

continue se salta el bloque de código restante, pero el bloque de código después de yield se ejecuta cuando next() es llamado de nuevo en el generador. yield actúa como pausar la ejecución en cierto punto.

8

yield en Python detiene la ejecución y devuelve el valor. Cuando se vuelve a invocar el iterador, continúa la ejecución directamente después de la instrucción yield. Por ejemplo, un generador de define como:

def function(): 
    yield 1 
    yield 2 

volvería 1 entonces 2 secuencialmente. En otras palabras, se requiere continue. Sin embargo, en este caso, elif y else como flashk describe son definitivamente las herramientas adecuadas.

0

Si el valor es algo sencillo y condiciones son los controles de la igualdad, yo prefiero hacer esta "estructura de la caja" diccionario de consulta:

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 
Cuestiones relacionadas