Ismerje meg, hogyan segíthet ez az alternatív funkciótípus csökkenteni a memóriaterületet.

Ha sorokat olvas ki egy naplófájlból, vagy egy hosszú tétellistát dolgoz fel, az egyik lehetőség a teljes adat betöltése a memóriába. Ez a megközelítés azonban sok memóriát igénybe vehet, és gátolhatja a teljesítményt. A generátorok értékes megoldást kínálnak.

A generátorok szükségtelenné teszik az összes adat egyidejű betöltését a memóriába. Hasznosak nagy adatkészletek, végtelen sorozatok kezelésekor, vagy bármilyen olyan forgatókönyv esetén, ahol a memória hatékonysága a legfontosabb.

Mik azok a generátorok?

A generátor egy speciális funkció, amely lehetővé teszi az értékek sorozatának iterációját. Ahelyett, hogy egy teljes adatkészletet adnának vissza, egyszerre egy értéket generálnak – vagy adnak ki. Ezáltal hatékonyan dolgozhatnak nagy vagy korlátlan adatsorokkal.

A normál Python függvény általában kiszámít egy értéket, és visszaadja azt. De a generátorok másképp működnek. Idővel több értéket is adhatnak, ha az egyes hozamok között szüneteltetik és folytatják a végrehajtást.

instagram viewer

A fő különbség a normál függvények és a generátorok között az, hogy ahelyett, hogy a Visszatérés kulcsszó az eredmény előállításához, a generátorok használják hozam.

Hogyan készítsünk generátort

Generátor létrehozásához ahelyett, hogy a Visszatérés állítás, használja a hozam utasítás a függvényen belül. A hozam A kulcsszó nemcsak arra utasítja a függvényt, hogy adjon vissza egy értéket, hanem lehetővé teszi az állapot mentését is, lehetővé téve a későbbi folytatást.

Íme egy példa egy egyszerű generátor függvényre:

defnumeric_generator():
yield1
yield2
yield3

gen = numeric_generator()

Ez a generátorfüggvény 1 és 3 közötti numerikus értékeket ad.

A hozam utasítás menti a függvény állapotát, megőrzi a helyi változókat a hívások között, hogy a következő érték kérésekor folytatódjon.

Generátor függvény hozzárendelése egy változóhoz létrehoz egy generátor objektumot, amellyel dolgozni lehet.

Munka generátorokkal

A generátoroknak több alkalmazása is van. Használhatod őket in for loop vagy listás értelmezéseken belül, valamint más iterálható struktúrák. A generátorok a függvények argumentumaiként is szolgálhatnak.

Miután létrehozott egy generátort, ismételheti azt a for ciklus segítségével:

for i in numeric_generator():
print(i)

Használhatja továbbá a következő függvény az értékek egyenkénti lekéréséhez:

print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3

Ez nagyobb irányítást biztosít a generátor objektum felett.

A generátorok nyomon követhetik állapotukat. Egy függvényben minden hozamkimutatás ellenőrzőpontként működik. Amikor felhívja a következő() függvényt a generátor objektumon, a végrehajtás az előző hozamponttól veszi fel.

Értékeket is átadhat egy generátornak a használatával Küld():

defgenerator_with_send():
# First yield: Receive a value
x = yield
print(f"Received: {x}")

# Second yield: Receive another value
y = yield
print(f"Received: {y}")

# Third yield: Yield the sum
yield x + y

gen = generator_with_send()

# Start generator and reach first yield
next(gen)

# Send 10 into generator, received at first yield
result = gen.send(10)

# Send 5 into generator, received at second yield
result = gen.send(5)

# Print result of third yield
print(result)

A Küld() A metódus lehetővé teszi az értékek lekérését a generátorból, és az értékek visszaküldését a generátor funkcióba, hatékonyan leállítva azt, és lehetővé teszi a végrehajtás vezérlését. A Küld() A módszer praktikus korutinok írásakor vagy generátorok speciális célokra történő használatakor.

Generátor kifejezések használata

A generátorkifejezések tömör módot kínálnak egy egyszerű és névtelen generátor létrehozására. Hasonlóak a felsorolás megértéséhez, de zárójelek helyett zárójeleket használnak.

Íme egy példa:

gen = (i**2for i in range(10))

for x in gen:
print(x)

A kód generátorkifejezést hoz létre, amely a 0 és 9 közötti számok négyzeteit adja. A generátorkifejezések ideálisak egy értéksorozat lusta generálására.

Generátorok használata adatfeldolgozáshoz

A Python-generátorok kényelmes módot kínálnak az adatfolyamok leírására és az iterátorok készítésére anélkül, hogy mindent a memóriában tartanának. Jelentősen javíthatja programozását, ha megtanulja a generátorok használatát, megkönnyítve ezzel a kihívást jelentő adatfeldolgozási feladatok kezelését.

Amikor legközelebb nagy adatkészletekkel dolgozik, tartsa szem előtt a generátorokat, és delegálja rájuk a munkaigényes feladatokat, így a kód érzékeny és hatékony marad.