5.3 TOISTO

5.3.1 While

Ohjelmoinnissa hyödynnetään toistoa moneen asiaan ja se onkin yksi keskeisimmistä rakenteista ohjelmoinnissa. Pythonissa on muutamia tapoja luoda toistorakenteita, eli silmukoita. Näistä yleisimmät ovat while- ja for-silmukat.

While-silmukan rakenne:

while ehto:
    suorita toiminto

While-silmukkaa toistetaan niin kauan kuin ehto on tosi, eli toimintoa suoritetaan, kunnes ehto ei ole tosi tai silmukka rikotaan muulla tavalla. While-silmukassa oleellista onkin, että jokin muuttuu joka toistolla, jotta silmukka päättyy joskus. While-silmukkaa käytetäänkin yleensä silloin, kun ei tiedetä tarkasti, kuinka monta toistoa tarvitaan, että ehto toteutuu.

Esimerkiksi seuraavanlainen silmukka on päättymätön, eli se päättyy vasta, kun ohjelma suljetaan tai kun tietokoneen muisti loppuu ja ohjelma (tai jopa tietokone) kaatuu, eli lakkaa toimimasta virheen takia.

ehto = True

while ehto:
    print(”Tervehdys!”)

While silmukkaan tuleekin lisätä jotain, joka muuttuu joka kierroksella ja joka vaikuttaa silmukan päättymiseen joko ehdolla tai muulla tavoin.

Eli päättääksemme edellisen tyyppisen while-silmukan, meidän on lisättävä siihen jotain, joka muuttuu esim. seuraavasti:

ehto = True

while ehto:
    print(”Tervehdys!”)
    ehto = False

Näin silmukka saadaan päätetyksi, mutta nyt suoritamme vain yhden kierroksen. Haluttu määrä kierroksia voidaan määritellä jo ehdossa, kuten tässä esimerkissä, jossa tervehdys tulostetaan kolmesti.

i = 0

while i <= 2:
    print(”Tervehdys!”)
    i += 1

Voidaan myös käyttää erillistä ehtolausetta silmukan suorittamisen päättämiseksi, kuten tässä esimerkissä, jossa suorittaminen päätetään, kun ehtolauseen ehto täyttyy.

i = 0
ehto = True

while ehto:
    print(“Tervehdys!”)

    if i >= 2:
        ehto = False
    i += 1

Silmukoiden suorittaminen voidaan päättää myös break-rakenteella. break keskeyttää silmukan suorittamisen siinä kohdassa, missä break-rakenne suoritetaan. Seuraavassa esimerkissä keskeytetään silmukan suoritus break-rakenteella, kun ehtolauseen ehto täyttyy.

i = 0

while True:
    print(“Tervehdys!”)

    if i >= 2:
        break
    i += 1

Toiston voi toteuttaa myös for-silmukkana, jonka avulla voidaan helposti käydä läpi esim. lista.

5.3.2 For

Jos tiedämme tarkasti tarvittavien toistojen määrän, voimme käyttää for-silmukkaa. For-silmukka eroaa while-silmukasta siten, että for-silmukassa toistojen määrä on etukäteen tiedossa. Siinä missä while-silmukka toistaa koodilohkoa niin kauan kuin jokin ehto pätee, for-silmukka toistaa koodilohkon jokaista läpikäytävän välin alkiota kohden, eli niin monta kertaa kuin läpikäytävällä välillä on alkioita.

Kuten while-silmukan, myös for-silmukan käyttöön on pari yleisesti käytettyä tapaa.

Tutkitaan ensinnä listan läpikäymistä, johon for-silmukka soveltuu erinomaisesti.

for alkio in lista:
    tee jotain

For-silmukka siis käy läpi listan, joka on sen läpikäytävänä tietorakenteena, tässä tapauksessa kokoelmana. For-silmukan osat ovatkin for-avainsana, silmukkamuuttuja, in-avainsana sekä läpikäytävä (tietorakenne). For-lauseen, kuten vastaavien toisto- tai ehtorakenteiden, perään tulee kaksoispiste ( : ), joka merkitsee sen päättymistä ja seuraavan koodilohkon aloittamista (uudelle riville sisennettynä).

MUOTOILE SEEURAAVA

Silmukka ei tietenkään käy läpi listaa, jota ei ole olemassa, eli listan, joka käydään läpi, tulee olla alustettu ennen for-silmukkaa.

Esim. seuraava EI toimi.

for alkio in lista:
    tee jotain

lista = [0, 1, 2, 3]

Listan määritys tulee olla ennen for-silmukkaa, eli koodi toimisi, jos se olisi seuraavanlainen:

lista = [0, 1, 2, 3]

for alkio in lista:
    tee jotain

Listan läpikäyminen on kuitenkin vain yksi vaihtoehto for-silmukan käytölle. Lisäksi voidaan käydä läpi jokin lukuväli käyttämällä range()-funktiota. range() palauttaa peräkkäisiä lukuja annettujen parametrien mukaisesti aloittaen oletuksena nollasta ja päättyen juuri ennen sitä lukua, joka on annettu (eli viimeinen luku ei tule mukaan). Esim. seuraava for-silmukka käy läpi luvut nollasta viiteen jättäen pois range():n parametriksi annetun luvun.

for i in range(6):
    tee jotain

Lukuvälin läpikäyminen aloitetaan oletuksena nollasta, sillä Pythonissa indeksointi aloitetaan nollasta, kuten useimmissa ohjelmointikielissä. range()-funktiolle voi kuitenkin antaa parametriksi myös lukuvälin alkuarvon seuraavan esimerkin mukaisesti:

for i in range(1,6):
    tee jotain

Tämä silmukka käy läpi luvut yhdestä viiteen jättäen jälleen pois parametrina annetun numeron 6. Lisäksi range()-funktiolle voi antaa vielä yhden parametrin, askeleen, joka määrittää, kuinka monta peräkkäistä lukua kerrallaan lukuvälillä edetään.

Esim. seuraava käy läpi kokonaisluvut [0:11[ siirtyen aina kaksi lukua eteenpäin yhden sijasta.

for i in range(0,11,2):
    print(i)

Tulosteena tulisi siis:

0
2
4
6
8
10

Huomioi myös, miten voimme tulostaa indeksin, joka käy läpi range()-funktion lukuvälin. Voimme myös tulostaa listassa olevat alkiot samalla tyylillä:

lista = [”yksi”, ”kaksi”, ”neljä”]

for alkio in lista:
    print(alkio)

Tämä tulostaisi:

yksi
kaksi
neljä

Voimme hyödyntää indeksejä myös eri tavoin esim. käyttäen itse listan sijaan listan pituutta ja antamalla se for-silmukan läpikäytäväksi.

lista = [”yksi”, ”kaksi”, ”neljä”]

for i in range(0, len(lista)):
    print(lista[i])

Tämä tulostaisi vastaavasti:

yksi
kaksi
neljä

For-silmukan läpikäytävä tietorakenne voi olla siis tallennettu muuttujaan, kuten havaitsimme aikaisemmin. Muuttujiin voidaan tallentaa myös lausekkeita, kuten range()-funktio parametreineen.

Esim.

sarja = range(0, 10, 3)

for luku in sarja:
    print(luku)

Tämä tulostaisi:

0
3
6
9

Useimmiten indeksiä merkitään muuttujalla i (i niin kuin index), mutta se voi olla mikä vain muuttuja. Käydessä läpi listoja voidaan merkitä listan jäsen indeksiksi, kuten yllä olevissa esimerkeissä ”alkio in lista” tai ”luku in sarja”. Jos käydään läpi tietorakennetta, jonka sisältö on yhdenlaista, voidaan antaa sillekin koherentimpi nimi, esim. ”auto in autot”.

For-silmukka voidaan, kuten while-silmukka, pysäyttää break-lauseella.

Esim. seuraava for-silmukka ei käy läpi kaikkia lukuja [0:10[, sillä se pysäytetään, kun indeksi on 5.

for i in range(0, 10):

    if i == 5:
        break

Jos for-silmukka suoritetaan loppuun, voidaan suorittaa jokin toimenpide käyttämällä valintarakenteista tuttua else-lausetta.

Esim. seuraava for-silmukka tulostaa ”Valmis”, kun se on suoritettu pysähtymättä loppuun asti.

for i in range(0,6):
    tee jotain

else:
    print(”Valmis”)

Sekä for- että while-silmukoilla voidaan myös hypätä yhden ”kierroksen”, eli iteraation yli käyttämällä continue-lausetta.

Esim.

i = 0

while i < 5:
    i = i + 1

    if i == 3:
        continue
    print(i)

Antaisi seuraavan tulostuksen:

1
2
4
5

Vastaavasti for-silmukan kanssa:

for i in range(1,6):

    if (i == 3):
        continue
    print(i)

Antaisi saman tulostuksen:

1
2
4
5

Hurraa! Teoriaosuus on nyt käyty läpi. On aika siirtyä tehtävien pariin.