Python Language Invio di oggetti a un generatore

Esempio

Oltre a ricevere i valori da un generatore, è possibile inviare un oggetto a un generatore usando il metodo 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

Quello che succede qui è il seguente:

  • Alla prima chiamata next(generator) , il programma avanza alla prima dichiarazione di yield e restituisce il valore total a quel punto, che è 0. L'esecuzione del generatore viene sospesa a questo punto.
  • Quando si chiama generator.send(x) , l'interprete prende l'argomento x e lo rende il valore di ritorno dell'ultima dichiarazione di yield , che viene assegnata al value . Il generatore procede come al solito, finché non produce il valore successivo.
  • Quando finalmente si chiama next(generator) , il programma lo tratta come se invii None al generatore. Non c'è nulla di speciale in None , tuttavia, questo esempio usa None come valore speciale per chiedere al generatore di fermarsi.