es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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))
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Explicación:

    La razón por la que yield total no resulta en 0 en la primera llamada se debe a la forma en que funciona el decorador coroutine. Cuando se decora la función sumer, el decorador coroutine crea un nuevo objeto generador y lo inicializa llamando a next() en él. Esto significa que cuando se asigna a su el valor retornado por sumer(), ya está apuntando a un generador que ha sido inicializado en la primera declaración de yield.

    Entonces, cuando se llama a print('EX2-1 -',su), en realidad imprime la dirección del objeto generador al que su está apuntando. Esto es porque la primera llamada a next() en el decorador coroutine 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 usar send() para enviarle algo. Entonces, cuando se llama a su.send(100), envía el valor 100 al generador y se ejecuta el código dentro del bucle, sumándolo a total. Luego, se ejecuta la declaración yield total, que devuelve el valor de total.

    En resumen, la primera llamada a su solo configura el generador y no ejecuta ningún código dentro de él. Necesitamos usar send() para enviar valores al generador y hacer que ejecute el código.

Comments are closed.