Opi kuinka tämä vaihtoehtoinen toimintotyyppi voi auttaa vähentämään muistia.
Jos luet rivejä lokitiedostosta tai käsittelet pitkää kohdeluetteloa, yksi vaihtoehto on ladata kaikki tiedot muistiin. Tämä lähestymistapa voi kuitenkin käyttää paljon muistia ja haitata suorituskykyä. Generaattorit tarjoavat arvokkaan ratkaisun.
Generaattorit poistavat tarpeen ladata kaikkia tietoja muistiin samanaikaisesti. Ne ovat hyödyllisiä käsiteltäessä suuria tietojoukkoja, äärettömiä sarjoja tai missä tahansa tilanteessa, jossa muistin tehokkuus on ensiarvoisen tärkeää.
Mitä generaattorit ovat?
Generaattori on erityinen toiminto, jonka avulla voit iteroida arvosarjaa. Sen sijaan, että ne palauttaisivat täydellisen tietojoukon, ne luovat – tai tuottavat – yhden arvon kerrallaan. Tämä tekee niistä tehokkaita suurten tai rajoittamattomien tietosarjojen käsittelyssä.
A tavallinen Python-toiminto yleensä laskee arvon ja palauttaa sen. Mutta generaattorit toimivat eri tavalla. Ne voivat tuottaa useita arvoja ajan mittaan keskeyttämällä ja jatkamalla suoritusta kunkin tuoton välillä.
Keskeinen ero tavallisten funktioiden ja generaattoreiden välillä on, että sen sijaan, että käytettäisiin palata avainsana tuottaakseen tuloksen, generaattorit käyttävät tuotto.
Kuinka luoda generaattori
Luodaksesi generaattorin, sen sijaan palata lausunto, käytä a tuotto lauseke funktion sisällä. The tuotto avainsana ei vain ohjaa funktiota palauttamaan arvoa, vaan myös antaa sen tallentaa tilansa mahdollistaen sen jatkamisen tulevaisuudessa.
Tässä on esimerkki yksinkertaisesta generaattorifunktiosta:
defnumeric_generator():
yield1
yield2
yield3
gen = numeric_generator()
Tämä generaattorifunktio tuottaa numeerisia arvoja 1-3.
The tuotto lauseke tallentaa funktion tilan säilyttäen paikalliset muuttujat kutsujen välillä, jotta se jatkuu, kun pyydät seuraavaa arvoa.
Generaattorifunktion määrittäminen muuttujalle luo generaattoriobjektin, jonka kanssa voit työskennellä.
Työskentely generaattoreiden kanssa
Generaattorilla on useita sovelluksia. Voit käyttää niitä in for silmukoita tai listan ymmärryksen sisällä, sekä muita iteroitavia rakenteita. Generaattorit voivat toimia myös funktioiden argumentteina.
Kun olet luonut generaattorin, voit iteroida sitä käyttämällä for-silmukkaa:
for i in numeric_generator():
print(i)
Voit myös käyttää Seuraava toiminto noutaa arvot yksitellen:
print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3
Tämä antaa sinulle enemmän hallintaa generaattoriobjektiin.
Generaattorit voivat seurata tilaansa. Jokainen funktion tuottolauseke toimii kuin tarkistuspiste. Kun soitat Seuraava() toiminto generaattoriobjektissa, suoritus poimii edellisestä myöhöpisteestä.
Voit myös siirtää arvoja generaattoriin käyttämällä lähettää():
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 lähettää() menetelmän avulla voit noutaa arvoja generaattorista ja lähettää arvot takaisin generaattoritoimintoon, keskeyttää sen tehokkaasti ja antaa sinun hallita sen suorittamista. The lähettää() menetelmä on kätevä kirjoitettaessa korutiineja tai käytettäessä generaattoreita edistyneisiin tarkoituksiin.
Generator-lausekkeiden käyttö
Generaattorilausekkeet tarjoavat tiiviin tavan luoda yksinkertainen ja anonyymi generaattori. Ne ovat samanlaisia kuin luettelon ymmärtäminen, mutta niissä käytetään sulkuja hakasulkeiden sijaan.
Tässä on esimerkki:
gen = (i**2for i in range(10))
for x in gen:
print(x)
Koodi luo generaattorilausekkeen, joka tuottaa lukujen 0-9 neliöt. Generaattorilausekkeet ovat ihanteellisia arvosarjan laiskaan luomiseen.
Generaattorien käyttö tietojenkäsittelyyn
Python-generaattorit ovat kätevä tapa kuvata tietovirtoja ja rakentaa iteraattoreita säilyttämättä kaikkea muistissa. Voit parantaa ohjelmointiasi merkittävästi oppimalla käyttämään generaattoreita, mikä helpottaa haastavien tietojenkäsittelytehtävien käsittelyä.
Kun seuraavan kerran työskentelet suurten tietojoukkojen kanssa, pidä generaattorit mielessä ja delegoi työvoimavaltaiset tehtävät heille, jotta koodisi pysyy reagoivana ja tehokkaana.