You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 3 Next »

Pythonissa on mahdollisuus tehdä funktiosta generaattori. Generaattorit palauttavat iteraattoriksi kutsutun olion, jolla on mahdollista tuottaa sarja arvoja. Tämä on vähän sama kuin, jos olisi lista ennaltamääritettyjä arvoja, jotka käydään peräkkäin läpi, mutta generaattoreiden tapauksessa ohjelmassa ei tarvitse varata muistia erilliselle listalle. Tämä voi johtaa suuriin säästöihin muistin käytössä, jos on käytävä suuri määrä arvoja läpi.

Funktiosta tehdään generaattori avainsanan yield avulla, joka toimii samaan tapaan kuin return. Sen avulla voi palauttaa arvon, mutta toisin kuin return, palautettuaan yhden arvon funktion suoritusta jatketaan uudestaan avainsanan yield jälkeen. Näitä "askelia" edetään generaattorissa sen palauttaman iteraattorin funktiolla next; aina kun funktiota next kutsutaan se palauttaa yhden arvon. Generaattorin toiminta päättyy joko funktion loppuun tai avainsanaan return. Loppuessaan iteraattori synnyttää poikkuksen.

Tässä on esimerkki generaattorista, joka palauttaa lukuarvojen neliöitä. Generaattorille välitetään parametri, joka määrittää kuinka monta lukua on tarkoitus käydä läpi. Tämä generaattori on tehty niin, että laskenta alkaa uudestaan alusta kun kaikki luvut on käyty loppuun.

def square(n):
    while True:
        for i in range(1, n + 1):
            yield i * i

it = square(3)

print(next(it))
print(next(it))
print(next(it))
print(next(it))

input("Paina Enter-näppäintä lopettaaksesi...")

Generaattorin voi asettaa for toistorakenteessa avainsanan in jälkeen, jolloin for käy läpi generaattorin tuottamat arvot. Generaattoreita voi käyttää for toistorakenteessa sijoittamalla generaattori avainsanan in jälkeen; iteraattorin palauttamia arvoja käydään läpi kunnes generaattori on käynyt loppuun.

Tässä esimerkki itsetehdyn generaattorin käytöstä for toistorakenteen kanssa. Aiempaan versioon täytyy tehdä muutos jotta iterointi loppuisi, muuten for toistorakenne jäisi ikuiseen silmukkaan.

def square(n):
    for i in range(1, n + 1):
        yield i * i

for i in square(10):
    print(i)

input("Paina Enter-näppäintä lopettaaksesi...")

Samoin käytäessä tiedostoa läpi toistorakenteessa for tiedosto-objekti toimii generaattorin, joka tuottaa tiedoston rivien mukaisia merkkijonoja. Samoin kokoelmat, joiden alkioita voidaan käydä läpi for toistorakenteessa. Muuttujista voi tehdä iteraattorin sisään rakennetun funktion iter avulla, joka ottaa parametriksi jonkun muuttujan.

  • No labels
You must log in to comment.