Python Language Envoi d'objets à un générateur


Exemple

En plus de recevoir des valeurs d'un générateur, il est possible d' envoyer un objet à un générateur à l'aide de la méthode 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

Ce qui se passe ici est le suivant:

  • Lorsque vous appelez next(generator) , le programme avance à la première déclaration de yield et retourne la valeur de total à ce point, qui est 0. L'exécution du générateur est suspendue à ce stade.
  • Lorsque vous appelez ensuite generator.send(x) , l'interpréteur prend l'argument x et en fait la valeur de retour de la dernière instruction de yield , qui est affectée à la value . Le générateur se déroule alors comme d'habitude, jusqu'à ce qu'il produise la valeur suivante.
  • Lorsque vous appelez enfin next(generator) , le programme traite cela comme si vous envoyiez None au générateur. Il n'y a rien de particulier à propos de None , cependant, cet exemple utilise None comme valeur spéciale pour demander au générateur de s'arrêter.