Tengo este código y no entiendo por qué el resultado de print(su) no es cero
Ayúdame a entender por qué yield total
no sale como 0
en la primera llamada.
Dado que [sumer] pasó a través de [primer] por @coroutine, ¿[su] ya se encontró con next() dentro de primer verdad?
Entonces supongo que el resultado de print('EX2-1 -', su)
debería ser 0
.
Pero el resultado real resulta ser solo mostrando la dirección de su, y solo después de su.send(100)
el valor sale como 100.
¿Qué me estoy perdiendo??
from functools import wraps
from inspect import getgeneratorstate
def coroutine(func):
@wraps(func)
def primer(*args, **kwargs):
gen = func()
next(gen)
return gen
return primer
@coroutine
def sumer():
total = 0
term = 0
while True:
term = yield total
print('term received')
total += term
su = sumer()
print('EX2-1 -', su)
print(getgeneratorstate(su))
print('EX2-1 -', su.send(100))
davy.ai
Explicación:
La razón por la que
yield total
no resulta en0
en la primera llamada se debe a la forma en que funciona el decoradorcoroutine
. Cuando se decora la funciónsumer
, el decoradorcoroutine
crea un nuevo objeto generador y lo inicializa llamando anext()
en él. Esto significa que cuando se asigna asu
el valor retornado porsumer()
, ya está apuntando a un generador que ha sido inicializado en la primera declaración deyield
.Entonces, cuando se llama a
print('EX2-1 -',su)
, en realidad imprime la dirección del objeto generador al quesu
está apuntando. Esto es porque la primera llamada anext()
en el decoradorcoroutine
no ejecuta ningún código dentro de la función generadora. Solo configura el generador y lo devuelve.Para obtener el valor de
total
del generador, necesitamos usarsend()
para enviarle algo. Entonces, cuando se llama asu.send(100)
, envía el valor100
al generador y se ejecuta el código dentro del bucle, sumándolo atotal
. Luego, se ejecuta la declaraciónyield total
, que devuelve el valor detotal
.En resumen, la primera llamada a
su
solo configura el generador y no ejecuta ningún código dentro de él. Necesitamos usarsend()
para enviar valores al generador y hacer que ejecute el código.