Курс по усъвършенствано разработване с Python
Глава
>
Ниво
Генератори
Създаване на генератор
Понякога може да искате да генерирате стойности последователно, вместо да получите еднократен изход. По подобие на това как работят функциите, генераторите се пишат и изпълняват по същия начин, с изключение че използват yield() вместо return() при генерирането на изход.
В това упражнение трябва да напълните бутилки с мляко от резервоарите в конюшнята. Използвайте генератор, за да преминете през процеса на пълнене на бутилките и да се уверите, че всяко излишно мляко се събира от резервоарите.

Цел
Напълнете бутилки с мляко, като изпомпвате резервуарите за мляко с помощта на генератори.
Машините, които съхраняват кравето мляко, са почти пълни, така че трябва да бутлирате млякото и да го съхраните, преди да се развали. Това може да бъде малко трудно, ако се използват обикновени методи, а количеството мляко, което можете да извлечете, може да варира. За щастие, можете да използвате генератори, за да направите този процес безпроблемен и лесен.
Има два (2) резервоара с мляко, от които трябва да изпомпате млякото и да го бутлирате. Всяка машина има отделения, които съхраняват млякото, и те са представени чрез константни списъци с имената: tank_a и tank_b. Освен това, всеки резервоар обикновено има излишък, който можете да съберете.
Генераторите следват същия синтаксис като функциите, но използват yield вместо return за връщане на резултата. Създайте генератор с име fill() и го настройте с аргумента list, който ще бъде мястото, в което въвеждате константите, споменати в горния абзац.
def fill(list):
for x in range(3):
yield list[x]
yield 5
Генераторът прочита данните от трите (3) полета в списъчните константи, представени от отделенията в машината, и добавя излишък в края, който е пет (5).
Съберете обекта кошница в полето, за да получите достъп до необходимите бутилки за пълнене, и се отправете към двете (2) X маркировки, за да съберете млякото чрез for цикъл.
Благодарение на инструкциите с yield, стойностите, генерирани от генератора, могат да бъдат прочетени директно с for цикъл. Създайте такъв, който използва функцията collect() за придобиване на "milk" от машината. След това използвайте speak(), за да проверите колко мляко съдържа всяка бутилка. Например:
for bottles in fill(tank_a): player.collect("milk") player.speak("%d pints of milk collected" % (bottles))
Изпълнете и използвайте този for цикъл и при двете X маркировки - при светлата X маркировка използвайте аргумента tank_a, а при тъмната X маркировка използвайте аргумента tank_b, за да завършите нивото.