Keresés


Toplista

Toplista
  • betöltés...

Magántanár kereső

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?

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
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

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).
1