...
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.
Code Block |
---|
} 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...") {code} |
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.
Code Block |
---|
} 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...") {code} |
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.