Ha szívesen korrepetálnál, hozd létre magántanár profilodat itt.
Ha diák vagy és korrepetálásra van szükséged, akkor regisztrálj be és írd meg itt, hogy milyen tantárgyban!
Mi az a generátor (+yield) a Pythonban?
SharpMan{ Elismert } kérdése
439
Miben "különleges"?
Jelenleg 1 felhasználó nézi ezt a kérdést.
python
0
Középiskola / Informatika
Válaszok
2
Sulc Martin{ Elismert }
megoldása
A yield megértéséhez szükség lesz megérteni, mik a generátorok. Mielőtt megérted mik a generátorok, tudni kell mik az iterátorok.
Egy tömb létrehozásával prezentálom most az iterátor jelentését:
array = [1, 2, 3]
for i in array:
print(i);
Mi történik?
Ezt kapjuk:
1
2
3
Tehát az iterátor végigfut a tömb összes elemén.
A generátoroknak az iterátort felhasználva tudunk bizonyos paramétereket adni, hogy melyik számokat szeretnék kihagyni például a tömbből.
Példa egy generátorra:
mygenerator = (x*x for x in range(3))
for i in mygenerator:
print(i)
Ezt kapjuk:
0
1
4
És akkor térjünk a yieldre.
A yield egy hasonló paraméter, mint a return. Ellenben generátort ad vissza mint végső érték.
A generátort úgy definiálják, mint egy normál függvényt, de valahányszor értéket kell generálnia, a yield kulcsszóval teszi ezt meg, nem pedig return-al.
Ha egy def yield-et tartalmaz, akkor a függvény automatikusan generátor lesz.
1
Még nem érkezett komment!
ifigazsi
válasza
Huhh a generátor olyan funkció, amiben van yield utasítás.
A lényeg, hogy egyszerre egy adatot adsz vissza, de többfelé lehet az érték. (Azaz elmenti hol tart ((hányszor futott már le))).
Amikor újra meghivod, onnét folytatja a futást.
Előnye, hogy nagyon memória hatékony, gondolj egy marha hosszú aminosavakból álló fehérjére. Az egész hossza mondjuk: 45 GB, ezt nem tudod betölteni a memóriába. Így kénytelen vagy aminosavanként vizsgálni. A yield pont ezt teszi lehetővé.
Másik, mondjuk nagy számokkal dolgozol, nem kell az összeset a memóriába tárolni elég az aktuálisat. (Pl. Fibonacci számok)
Ugyanez pepitába: mondjuk fajlbeolvasásnál tudod soronként vizsgálni az adatot, és nem kell egy brutális méretű csvvel játszani.
Röviden ennyi lenne. (Szerintem ritkán kerül elő, hacsak nem érint sűrűn a fenti problémakör).