Курс за напреднала разработка на 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, за да завършите нивото.