Pokročilý kurz vývoje v Pythonu
Kapitola
>
Úroveň
Generátory
Vytváření generátoru
Někdy můžete chtít generovat hodnoty konzistentně spíše než jednorázově. Podobně jako funkce, i generátory jsou napsány a prováděny stejným způsobem, kromě toho, že při produkci výstupu používají yield() místo return().
V tomto cvičení musíte naplnit lahve mlékem z nádrží ve stáji. Použijte generátor k iteraci plnění lahví a zajištění, že jakýkoliv přebytek mléka je shromážděn z nádrží.

Cíl
Naplnit lahve mlékem čerpáním mléka z nádrží pomocí generátorů.
Stroje, které skladují kravské mléko, jsou téměř plné, musíte mléko naplnit do lahví a uskladnit, než se zkazí. To může být trochu složitý úkol běžnými způsoby a množství mléka, které můžete vytáhnout, se může mírně lišit. Naštěstí můžete použít generátory, aby byl tento proces plynulý a přímý.
Existují dvě (2) nádrže s mlékem, které je třeba přečerpat a naplnit do lahví. Každý stroj má přihrádky, které uchovávají mléko, ty jsou reprezentovány seznamovými konstantami pojmenovanými: tank_a a tank_b . Kromě toho má každá nádrž tendenci mít přebytek, který můžete shromáždit.
Generátory následují stejnou syntaxi jako funkce, ale místo return použijí pro svůj výstup yield. Nastavte generátor pojmenovaný fill() a nastavte ho s argumentem list, to by bylo místo, kam vložíte výše zmíněné konstanty.
def fill(list):
for x in range(3):
yield list[x]
yield 5
Generátor čte data z tří (3) polí ve seznamových konstantách, které představují přihrádky ve stroji, a přidává přebytek na konci, který činí pět (5).
Sbírejte objekt koše v poli, abyste získali přístup k potřebným lahvím pro plnění, a přejděte k oběma znakům X pro sběr mléka pomocí cyklu for.
Díky příkazu yield mohou být hodnoty vyprodukované z generátoru čteny přímo z cyklu for. Nastavte jeden, který používá funkci collect() k získání "mléka" ze stroje. Následujte to použitím speak() k ověření, kolik mléka každá láhev obsahuje. Například:
for bottles in fill(tank_a): player.collect("milk") player.speak("%d pints of milk collected" % (bottles))
Napište a použijte tento cyklus for na obou znacích X, na světlém znaku X použijte argument tank_a a na tmavém znaku X použijte argument tank_b, abyste dokončili úroveň.