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.
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 + ygen = 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.