Curs Avansat de Dezvoltare Python
Capitolul
>
Nivel
Generatori
Avansarea manuală a unui generator
Obiectiv
Folosește generatorul într-o secvență manuală pentru a asambla și produce materiale pentru a face pâine.
În față se află o facilitate unde poți asambla aluatul de pâine folosind prese. În mod normal, ai folosi funcția combine() pentru a aduna materialele, însă aici nu este cazul, materialele trebuind să fie rafinate mai întâi înainte de a fi combinate.
Pentru această sarcină putem utiliza generatoare deoarece pot fi personalizate să emită diferite tipuri de fișiere, precum și să fie apelate la comandă, nu automat ca în cazul funcțiilor și buclelor. Iată un exemplu:
def bread():
yield 5
yield "grain"
Codul de mai sus conține un generator cu două instrucțiuni yield, una dintre ele producând un număr real și cealaltă un șir de caractere. Valorile generatorului pot fi apelate la nevoie folosind funcția next(). Așa:
recipe = bread() # Inițializează Generatorul player.place(next(recipe)) # Se apelează prima valoare player.collect(next(recipe)) # Se apelează a doua valoare
În exemplul de mai sus, generatorul este inițializat, iar funcția next() este folosită cu generatorul pentru a apela prima valoare yield, în scopul folosirii acesteia în funcția place(). Acest proces se repetă pentru a doua valoare, care este utilizată în funcția collect(). Astfel, este ușor să apelezi valori de diferite tipuri într-o secvență fără a fi nevoie să folosești mai multe liste sau variabile.
Un generator numit bread() va fi definit în editorul de cod, însă acesta va necesita numerele de cantitate pentru fiecare ingredient, pentru a putea rafina aluatul de pâine. Aceste numere sunt scrise pe semnul aflat lângă facilitate. Inițializează generatorul pentru utilizare referindu-te la el astfel: recipe = bread()
Mai întâi, mergi către semnul cu X luminos de lângă rezervorul de lapte și collect() ultima parte de lapte din rezervor folosind funcția next() a generatorului, astfel: player.collect(next(recipe)). Apoi, mergi la semnul cu X auriu de lângă semn și folosește funcția speak() pentru a obține numerele de cantitate necesare pentru ca generatorul să producă pâinea și notează-le în generator. Datele sunt stocate într-o constantă numită "sign" și pot fi apelate astfel: player.speak(sign).
După ce toate valorile au fost introduse în generator, intră în facilitate și folosește player.place(next(recipe)) pe semnele X întunecate și player.collect(next(recipe)) pe semnele X luminoase pentru a finaliza nivelul.