Avancé
🧠 Fondamentaux
30 XP
0 personnes ont réussi
Coroutine : accumulateur avec send
Jusqu'ici, on a vu les générateurs comme des producteurs de données : ils produisent des valeurs avec yield. Mais yield peut aussi recevoir des valeurs. C'est le principe des coroutines.
Dans une coroutine, yield fait deux choses : il produit une valeur vers l'extérieur ET il reçoit une valeur envoyée par send().
Voici comment ça marche :
def accumulateur(): total = 0 while True: valeur = (yield total) total += valeur
Le premier next() est obligatoire : il fait avancer la coroutine jusqu'au premier yield. On appelle ça amorcer la coroutine. Ensuite, chaque send(valeur) envoie une valeur au yield, qui l'assigne à la variable, et la coroutine continue jusqu'au prochain yield.
Écris une coroutine moyenne_mobile() qui reçoit des nombres via send() et renvoie la moyenne de tous les nombres reçus jusqu'ici.
Exemple : m = moyenne_mobile() next(m) renvoie 0 m.send(10) renvoie 10.0 m.send(20) renvoie 15.0 m.send(30) renvoie 20.0
Tests (3/4)
Amorçage
m = moyenne_mobile()
assert next(m) == 0
Après un send
m = moyenne_mobile()
next(m)
assert m.send(10) == 10.0
Après trois send
m = moyenne_mobile()
next(m)
m.send(10)
m.send(20)
assert m.send(30) == 20.0
+ 0 tests cachés
Indices (3 disponibles)
Solution officielle
def moyenne_mobile():
total = 0
count = 0
moyenne = 0
while True:
valeur = (yield moyenne)
total += valeur
count += 1
moyenne = total / count