Zaawansowany kurs programowania w Pythonie
Rozdział
>
Poziom
Generatory
Tworzenie Generatora
Czasami możesz chcieć generować wartości w sposób ciągły, a nie jako jednorazowy wynik. Podobnie jak funkcje, generatory są pisane i wykonywane w ten sam sposób, z tym że zamiast return() używają yield(), gdy produkują wynik.
W tym ćwiczeniu musisz napełniać butelki mlekiem z cystern w stajni. Użyj generatora, aby iterować napełnianie butelek i upewnić się, że wszelkie nadwyżki mleka są zbierane z cystern.

Cel
Napełnij butelki mlekiem, pompując mleko ze zbiorników za pomocą generatorów.
Maszyny przechowujące mleko krowie są prawie pełne, musisz butelkować mleko i przechowywać je, zanim się zepsuje. To może być nieco trudne zadanie przy użyciu normalnych metod, a ilość mleka, którą możesz wyekstrahować, może się nieco różnić. Na szczęście możesz użyć generatorów, aby ten proces był płynny i prosty.
Są dwa (2) zbiorniki z mlekiem, które trzeba wypompować i butelkować. Każda maszyna ma komory, które przechowują mleko, są one reprezentowane przez stałe listy o nazwach: tank_a i tank_b. Ponadto, każdy zbiornik ma tendencję do posiadania nadwyżki, którą możesz zebrać.
Generatory mają tę samą składnię co funkcje, ale użyją yield zamiast return dla swojego wyniku. Ustaw generator o nazwie fill() i ustaw go z argumentem list, to będzie miejsce, gdzie wprowadzisz wspomniane wcześniej stałe.
def fill(list):
for x in range(3):
yield list[x]
yield 5
Generator odczytuje dane z trzech (3) pól w stałych listach, reprezentowanych przez komory w maszynie, i dodaje nadwyżkę na końcu, która wynosi pięć (5).
Zbierz obiekt koszyka w polu, aby uzyskać dostęp do potrzebnych butelek do napełnienia i przejdź do dwóch (2) miejsc oznaczonych X, aby zebrać mleko, używając pętli for.
Dzięki instrukcji yield, wartości wytwarzane przez generator mogą być odczytywane bezpośrednio z pętli for. Ustaw taką pętlę, która używa funkcji collect(), aby zdobyć "mleko" z maszyny. Następnie użyj speak(), aby sprawdzić, ile mleka każda butelka przechowała. Na przykład:
for bottles in fill(tank_a): player.collect("milk") player.speak("%d pints of milk collected" % (bottles))
Napisz i użyj tej pętli for na obu miejscach X, na jasnym miejscu X użyj argumentu tank_a, a na ciemnym miejscu X użyj argumentu tank_b, aby ukończyć poziom.