Python Language Enviando objetos a un generador.


Ejemplo

Además de recibir valores de un generador, es posible enviar un objeto a un generador utilizando el método send() .

def accumulator():
    total = 0
    value = None
    while True:
        # receive sent value
        value = yield total
        if value is None: break
        # aggregate values
        total += value

generator = accumulator()

# advance until the first "yield"
next(generator)      # 0

# from this point on, the generator aggregates values
generator.send(1)    # 1
generator.send(10)   # 11
generator.send(100)  # 111
# ...

# Calling next(generator) is equivalent to calling generator.send(None)
next(generator)      # StopIteration

Lo que pasa aquí es lo siguiente:

  • Cuando llama por primera vez al next(generator) , el programa avanza a la primera declaración de yield y devuelve el valor del total en ese punto, que es 0. La ejecución del generador se suspende en este punto.
  • Cuando llama a generator.send(x) , el intérprete toma el argumento x y lo convierte en el valor de retorno de la última declaración de yield , que se asigna al value . El generador continúa como de costumbre, hasta que da el siguiente valor.
  • Cuando finalmente llama a next(generator) , el programa trata esto como si estuviera enviando None al generador. No hay nada especial en None , sin embargo, este ejemplo utiliza None como un valor especial para pedirle al generador que se detenga.