Pokročilý kurz vývoje v Pythonu
Kapitola
>
Úroveň
Generátory
Manuálně posouvání generátoru
Cíl
Použijte generátor v manuální sekvenci ke složení a výrobě materiálů pro výrobu chleba.
Před vámi se nachází zařízení, kde můžete sestavit těsto na chléb pomocí lisů. Normálně byste použili funkci combine() ke složení materiálů, ale zde je to jinak, materiály je nejprve nutné zpracovat, než je budete moci složit.
Pro tento úkol můžeme použít generátory, protože je lze upravit tak, aby vracely různé typy souborů a aby jejich sekvence byla volána na příkaz, namísto automatického výstupu jako u funkcí a cyklů. Zde je příklad:
def bread():
yield 5
yield "grain"
Výše uvedený kód obsahuje generátor se dvěma yield příkazy, z nichž jeden vytváří reálné číslo a druhý řetězec. Hodnoty generátoru můžeme získat dle libosti pomocí funkce next(). Takto:
recipe = bread() # Nastaví generátor player.place(next(recipe)) # Zavolá se první hodnota player.collect(next(recipe)) # Zavolá se druhá hodnota
V výše uvedeném příkladu je generátor nastaven a funkce next() je použita s generátorem k vyvolání první hodnoty yield pro použití ve funkci place(). Totéž je provedeno s druhou hodnotou, která je však použita ve funkci collect(). To usnadňuje volání hodnot různých typů v sekvenci, aniž by bylo třeba používat více seznamů nebo proměnných.
V editoru kódu bude definován generátor s názvem bread(), ale bude vyžadovat množství čísel pro každou ingredienci, aby bylo možné těsto na chléb zpracovat. Tato čísla jsou napsána na ceduli vedle zařízení. Nastavte generátor k použití jeho referencí, například: recipe = bread()
Nejprve jděte ke světlé značce X vedle nádrže s mlékem a pomocí funkce next() generátoru zavolejte player.collect(next(recipe)), čímž získáte poslední mléko z nádrže. Pak jděte ke zlaté značce X vedle cedule a použijte funkci speak(), abyste získali množství čísel potřebných pro generátor k výrobě chleba, a zapište je do generátoru. Data jsou uložena v konstantě s názvem "sign" a zavoláte je následovně: player.speak(sign).
Jakmile jsou všechny hodnoty zadány do generátoru, vstupte do zařízení a použijte player.place(next(recipe)) na tmavé značky X a player.collect(next(recipe)) na světlé značky X, abyste dokončili úroveň.