Exercices Fonctions & Modules Coroutine : accumulateur avec send
🎉

Bravo!

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

acc = accumulateur()
next(acc) amorce la coroutine, renvoie 0
acc.send(5) renvoie 5
acc.send(3) renvoie 8

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.py