Siit saate teada, kuidas see alternatiivne funktsioonitüüp aitab teil mälumahtu vähendada.
Kui loete ridu logifailist või töötlete pikka üksuste loendit, on üks võimalus laadida kogu andmed mällu. See lähenemisviis võib aga kasutada palju mälu ja takistada jõudlust. Generaatorid pakuvad väärtuslikku lahendust.
Generaatorid välistavad vajaduse kõiki andmeid korraga mällu laadida. Need on kasulikud suurte andmekogumite, lõputute järjestuste või mis tahes stsenaariumi käsitlemisel, kus mälu tõhusus on ülimalt oluline.
Mis on generaatorid?
Generaator on spetsiaalne funktsioon, mis võimaldab teil väärtuste jada üle korrata. Täieliku andmekomplekti tagastamise asemel genereerivad need – või annavad – ühe väärtuse korraga. See muudab need tõhusaks suurte või piiramatute andmejadadega töötamiseks.
A tavaline Pythoni funktsioon tavaliselt arvutab väärtuse ja tagastab selle. Kuid generaatorid töötavad erinevalt. Need võivad aja jooksul anda mitu väärtust, peatades ja jätkates täitmist iga saagise vahel.
Põhiline erinevus tavafunktsioonide ja generaatorite vahel on see, et selle asemel, et kasutada tagasi märksõna tulemuse saamiseks, generaatorid kasutavad saagikus.
Kuidas luua generaatorit
Generaatori loomiseks selle asemel tagasi avaldus, kasutage a saagikus avaldus funktsiooni sees. The saagikus Märksõna mitte ainult ei juhenda funktsiooni väärtust tagastama, vaid võimaldab ka selle oleku salvestada, võimaldades edaspidist jätkamist.
Siin on näide lihtsast generaatorifunktsioonist:
defnumeric_generator():
yield1
yield2
yield3
gen = numeric_generator()
See generaatorifunktsioon annab arvväärtusi vahemikus 1 kuni 3.
The saagikus avaldus salvestab funktsiooni oleku, säilitades kohalikud muutujad kõnede vahel, et jätkata järgmise väärtuse taotlemisel.
Generaatori funktsiooni määramine muutujale loob generaatoriobjekti, millega saate töötada.
Töö generaatoritega
Generaatoritel on mitu rakendust. Saate neid kasutada in for silmused või loendi mõistmise piires, aga ka muud itereeritavad struktuurid. Generaatorid võivad toimida ka funktsioonide argumentidena.
Kui olete generaatori loonud, saate seda korrata, kasutades for-tsüklit.
for i in numeric_generator():
print(i)
Võite kasutada ka järgmiseks funktsioon väärtuste ükshaaval hankimiseks:
print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3
See annab teile suurema kontrolli generaatori objekti üle.
Generaatorid saavad oma olekut jälgida. Iga funktsiooni tootluslause toimib kontrollpunktina. Kui helistate järgmine () funktsioon generaatori objektil, algab täitmine eelmisest tulupunktist.
Samuti saate väärtusi generaatorisse edastada kasutades saada():
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)
The saada() meetod võimaldab hankida väärtusi generaatorist ja saata väärtused tagasi generaatori funktsiooni, peatades selle tõhusalt ja võimaldades teil kontrollida selle täitmist. The saada() meetod on mugav korutiinide kirjutamisel või generaatorite kasutamisel täiustatud eesmärkidel.
Generaatori avaldiste kasutamine
Generaatori avaldised pakuvad kokkuvõtlikku viisi lihtsa ja anonüümse generaatori loomiseks. Need sarnanevad loendi mõistmisega, kuid kasutavad sulgude asemel sulgusid.
Siin on näide:
gen = (i**2for i in range(10))
for x in gen:
print(x)
Kood loob generaatoriavaldise, mis annab numbrite ruudud 0 kuni 9. Generaatori avaldised on ideaalsed väärtuste jada laisaks genereerimiseks.
Generaatorite kasutamine andmetöötluseks
Pythoni generaatorid on mugav viis andmevoogude kirjeldamiseks ja iteraatorite loomiseks ilma kõike mällu hoidmata. Saate oma programmeerimist oluliselt täiustada, õppides kasutama generaatoreid, muutes keerukate andmetöötlusülesannete lahendamise lihtsamaks.
Järgmine kord, kui töötate suurte andmekogumitega, pidage meeles generaatoreid ja delegeerige töömahukad ülesanded neile, et teie kood oleks tundlik ja tõhus.