working with type outside instruction generators explicacion creating python yield

python - with - Retorno y rendimiento en la misma función.



yield instruction python (3)

Hay una manera de lograr tener un método de rendimiento y rendimiento en una función que le permite devolver un valor o generador.

Probablemente no sea tan limpio como desearías, pero hace lo que esperas.

Aquí hay un ejemplo:

def six(how_many=None): if how_many is None or how_many < 1: return None # returns value if how_many == 1: return 6 # returns value def iter_func(): for count in range(how_many): yield 6 return iter_func() # returns generator

¿Qué sucede exactamente, cuando rendimiento y rendimiento se usan en la misma función en Python, así?

def find_all(a_str, sub): start = 0 while True: start = a_str.find(sub, start) if start == -1: return yield start start += len(sub) # use start += 1 to find overlapping matches

¿Sigue siendo un generador?


Sí, sigue siendo un generador. El return es (casi) equivalente a aumentar StopIteration .

PEP 255 lo explica:

Especificación: devolución

Una función generadora también puede contener declaraciones de retorno de la forma:

"return"

Tenga en cuenta que una expresión_lista no está permitida en las declaraciones de retorno en el cuerpo de un generador (aunque, por supuesto, pueden aparecer en los cuerpos de funciones no generadoras anidadas dentro del generador).

Cuando se encuentra una declaración return, el control continúa como en cualquier función return, ejecutando las cláusulas finalmente apropiadas (si existen). Luego se genera una excepción StopIteration, que indica que el iterador está agotado. También se genera una excepción StopIteration si el control fluye desde el extremo del generador sin un retorno explícito.

Tenga en cuenta que return significa "He terminado y no tengo nada interesante que devolver", tanto para funciones generadoras como para funciones no generadoras.

Tenga en cuenta que el retorno no siempre es equivalente a aumentar StopIteration: la diferencia radica en cómo se tratan las construcciones de prueba try / except. Por ejemplo,

>>> def f1(): ... try: ... return ... except: ... yield 1 >>> print list(f1()) []

porque, como en cualquier función, return simplemente sale, pero

>>> def f2(): ... try: ... raise StopIteration ... except: ... yield 42 >>> print list(f2()) [42]

porque StopIteration es capturado por un simple "excepto", como es una excepción.


Sí, sigue siendo un generador. Un return vacío o return None se puede usar para finalizar una función de generador. Es equivalente a generar una StopIteration (vea la respuesta de @ NPE para más detalles).

Tenga en cuenta que un retorno con argumentos que no son Ninguno es un SyntaxError en las versiones de Python anteriores a la 3.3.

Como señaló @BrenBarn en los comentarios a partir de Python 3.3, el valor de retorno ahora se pasa a StopIteration.

De PEP 380 :

En un generador, la declaración

return value

es semánticamente equivalente a

raise StopIteration(value)