Pokročilý kurz vývoje v Pythonu
Kapitola
>
Úroveň
Generátory
Odesílání dat do generátoru
Cíl
Seber vlnu a předej ji do příze pomocí vřeten tím, že do generátoru pošleš data.
Některá ovce jsou už trochu příliš vlna, bylo by lepší je ostříhat a sebrat jejich vlnu. Poté můžeš vložit vlnu do vřetena, abys vyrobil přízi. K dosažení tohoto cíle budeme potřebovat použít generátor, protože množství zpracované příze a vlny se může výrazně lišit.
Nejprve definuj generátor schopný předení příze, pojmenuj ho spin(). Tento generátor je potřeba nastavit tak, aby používal externí vstup pro svou činnost. Čte data z yield a ukládá je do proměnné, poté modifikuje její obsah zvětšováním její délky v každém cyklu, a nakonec produkuje výsledek.
def spin():
cycle = 1
while True:
cycle += 1
yarn = yield
yarn = yarn * cycle
yield player.speak("You've spun %d ft of yarn" % (yarn))
Protože se jedná o generátor, příkaz while() uvnitř může být pozastaven a modifikován, aby produkoval výstup, který chceme. Tato úroveň kontroly je jádrem toho, co generátor je a jak může být užitečný při zpracování dat. Pro vložení dat do generátoru ho nejprve definuj a použij funkci send(), kterou do něj pošleš jakákoli data, například:
spindle = spin() # Vytvoření instance generátoru next(spindle) # Provedení jednoho kroku generátoru spindle.send(6) # Vložení dat do generátoru # V tomto případě posíláš číslo 6
Projdi se ke světlu, kde X značí místo podle barevných koberců, a postav se ovcím. Existuje konstantní slovník s názvem sheep, který obsahuje hodnotu udávající, kolik vlny lze ostříhat z každé ovce. Použij funkci speak() se slovníkem a barvou koberce, na kterém stojíš, pro ostříhání ovčí vlny a zkontroluj, kolik jsi jich nasbíral. Například: player.speak(sheep["green"]).
Jsou zde čtyři (4) barevné koberce celkem: "green", "red", "blue" a "orange". Jakmile ostříháš ovce, projdi se ke tmavým X značkám u každého barevného koberce, kde se nacházejí vřetena. Použij send(), abys zadal počet liber vlny ostříhané z každé ovce v odpovídající barvě do generátoru.
Například, pokud při ostříhání ovcí na koberci "green" ostříháš 4 libry vlny, jdi k tmavému X značce u koberce "green" a pošli tato data do generátoru následovně:
next(spindle) spindle.send( 4)
Uděláš to pro všechny čtyři (4) tmavé X značky u barevných koberců, abys dokončil úroveň.