working with type outside instruction generators explicacion creating python yield

with - yield instruction python



¿Qué hace el rendimiento como tarea? myVar=(rendimiento) (2)

Estoy familiarizado con el rendimiento para devolver un valor gracias principalmente a esta pregunta

pero ¿qué hace el rendimiento cuando está en el lado derecho de una tarea?

@coroutine def protocol(target=None): while True: c = (yield) def coroutine(func): def start(*args,**kwargs): cr = func(*args,**kwargs) cr.next() return cr return start

Me encontré con esto, en las muestras de código de este blog , mientras investigaba las máquinas estatales y las coroutines.


La declaración de yield utilizada en una función convierte esa función en un "generador" (una función que crea un iterador). El iterador resultante normalmente se reanuda llamando a next() . Sin embargo, es posible enviar valores a la función llamando al método send() lugar de next() para reanudarla:

cr.send(1)

En su ejemplo, esto asignaría el valor 1 a c cada vez.

cr.next() es efectivamente equivalente a cr.send(None)


Puede enviar valores al generador utilizando la función de send .

Si ejecutas:

p = protocol() p.next() # advance to the yield statement, otherwise I can''t call send p.send(5)

entonces el yield devolverá 5, por lo que dentro del generador c será 5.

Además, si llama a p.next() , el yield devolverá None .

Puedes encontrar más información here .