Salut les gars , donc je me demandais pourquoi lors de la make_song () fonction elle a effectivement travaillé, je pensais que la version que je vais montrer ci - dessous ne serait pas travailler comme il le fait:
def make_song(count = 99, beverage = "soda"):
while count > 0:
if count > 1:
yield "{} bottles of {} on the wall.".format(count, beverage)
count -=1
elif count == 1:
yield "Only {} bottle of {} left!".format(count, beverage)
count -= 1
yield "No more {}!".format(beverage)
hey = make_song(5, "coke")
print(next(hey))
print(next(hey))
print(next(hey))
print(next(hey))
print(next(hey))
print(next(hey))
ma conclusion était que lorsque compter 1 == il imprimerait:
Seulement 1 bouteille de coke gauche!
Pas plus de coke!
parce qu'ils étaient tous les deux sous le même si la déclaration. À ma grande surprise, il a travaillé la façon dont je voulais travailler, en imprimant seulement « seulement 1 bouteille de coke gauche! » lorsque le nombre == 1, et puis quand je l' ai utilisé suivant () à nouveau , elle écrirait « Pas plus de coke! », je ne m'y attendais pas celui - ci pour le travail,
pourquoi at-il pas imprimer les rendements lorsque le nombre == 1 alors qu'ils étaient sous la même instruction if?
La partie du code qui détermine quand le générateur donne vous quelque chose yield
et non if
. Le if
seul détermine les lignes est exécuté en fonction d'une condition.
En pratique , un générateur est une généralisation d'une fonction. Une fonction retourne une valeur une fois, tandis qu'un rendement du générateur autant de fois que d' une yield
déclaration est atteinte. Après chaque yield
exécution est suspendue, et sur le prochain appel à next()
l'exécution reprend et se poursuit jusqu'à la prochaine yield
se trouve.
Une alternative à l' next()
appel est d'utiliser l'itérateur directement dans une for
boucle, qui sera épuiser tous les possibles yield
points d' extrémité.
Par exemple:
for s in make_song(5, "coke"):
print(s)
te donnera:
5 bottles of coke on the wall.
4 bottles of coke on the wall.
3 bottles of coke on the wall.
2 bottles of coke on the wall.
Only 1 bottle of coke left!
No more coke!