Yleistä
Python-kielessä on kaksi toistorakennetta; alkuehtoinen for sekä avoin while.
Tässä tutkitaan for-silmukka (for-loop). Toistorakenne on yhdistelmä peräkkäis- ja ehtorakennetta.
Koodissa toistetaan peräkkäisiä käskyjä kunnes ehto täyttyy ja päästään ikäänkuin ulos silmukasta.
Ei sen ihmeellisempää ole.
Silmukan suurin etu on että se vähentää kirjoitettavan koodin määrää.

Jos tulet mukaan C-kielen kulttuurista, niin tärkeää heti huomata,
että Pythonin for-silmukka toimii eri tavoin kuin C-kielen for-lauseke.
Pythonissa se käy läpi minkä tahansa iteroitavan tietotyypin kuten listan tai tiedoston.
Mutta aluksi me käsittelemme vain kokonaisulukumuuttujien kanssa määritellyn for-loopin.

for-silmukkalause, for-loop
Jos tiedetään etukäteen, montako kertaa ohjelmasilmukka tulee tehdä, käytetään for-lausetta.

for-silmukka

for-silmukan formaatti:
for i in range(x):
        ohjelmalauseet

Range-funktio
Koodissa ajettavien silmukoiden lukumäärä asetetaan Pythonin sisäänrakennetulla range-funktiolla.
Range-funktion parametrien (parametri-käsite selviää kun käsitellään omatekemiä funktioita)
pitää olla kokonaislukuja, integer, ja
  ** ne aloitetaan oletusarvoisesti nollasta ellei toisin määrätä,
  ** askelletaan yksi askel kerrallaan, ellei toisin määrätä,
  ** päättyy stop-arvoa edeltävään lukuun

Range-funktio luo lukujonon, jonka ensimmäinen alkio on 0 ja parametrina annetun luvun välillä.
Esim. komento range(6), antaa luvut 0, 1, 2, 3, 4, 5.
Jokainen luku on vuorollaan muuttujan i arvona.
Ensimmäisellä kierroksella i saa arvon 0 ja aloitetaan lohkon käskyjen ajo.
Kierroksen lopussa on testi “joko i on yhtäkuin loppuarvo?”, ellei,
silmukkalaskuri i inkrementoidaan eli i=i+1 ja ajetaan uusi kierros.
Joka kierroksen lopussa on testi.
Jos halutaan, että lukujonossa peräkkäisten lukujen erotus on suurempi kuin 1, siis askellus,
voidaan haluttu väli antaa range-funktiolle kolmantena tietona näin;
range(alkuarvo, stop-arvo, askellus).
Tämä tuottaa lukujonon, jossa esiintyvät askelluksen välein olevat luvut alkaen alkuarvosta ja
päättyen viimeiseen lukuun, joka on pienempi kuin stop-arvo.
Jos lukujonon halutaan alkavan jostain muusta luvusta kuin nollasta,
voidaan se määritellä samalla, esim näin:
range(3, 6),
jolloin lukujono on 3, 4, 5.
Kun i on saavuttanut stop-arvoa edeltävän arvon, päästään ulos silmukasta.

Johdannossa kerroin ettei muuttujana saa käyttää yksittäistä kirjainta.
Sitä neuvoa kannattaa noudattaa.
For-loopin tapauksessa tuosta ohjeesta poiketaan,
sillä yksikirjaimista muuttujaa i on käytetty for-loopin kanssa ohjelmoinnissa iät ja ajat.
Aateluus ja perinteet velvoittavat.

Jos useita lauseita liittyy for-silmukkaan, ne on sisennettävä kaikki samaan lohkoon.

 

for-silmukka, for-loop
parhaiten for-loopin toiminta selviää, kun käydään läpi pari mallikoodia.
Kirjoita kuvan mukainen koodi ja aja se.

Analyysi:
Mallikoodin for-silmukan range-funktio luo oletusarvoisesti lukujonon nollan ja parametrina annetun luvun välillä.
**  jonka ensimmäinen alkio on 0, ellei toisin määrätä, ei määrätty, joten alussa i=0
** askelletaan yksi askel kerrallaan, ellei toisin määrätä, ei määrätty, joten i=i+1
** silmukka päättyy stop-arvoa 5 edeltävään lukuun, eli neloseen, 5-1

For-loopin silmukkalaskuri, tässä tapauksessa muuttuja i,
sille asetetaan alkuarvoksi 0 ja loppuarvoksi 5.
Alkuarvon asetuksen jälkeen ajetaan kaikki silmukkaan kuuluvat käskyt,
mallikoodissa niitä tosin on vain yksi, silmukkalaskurin tulostus.
Kun silmukan käskyt on tehty, niin Python suorittaa testin;
”joko i on yhtäkuin stop-arvoa edeltävä luku eli 5-1”?
Ellei, ensimmäisen kierroksen jälkeen päivitetään silmukkalaskuri i,
eli i=i+1, toisen kierroksen jälkeen sama juttu, kunnes testin tulos on 5-1 ja tullaan ulos silmukasta.
Huomasithan, että for-lohko määritetään sisennyksellä kaksoispisteen jälkeen.

Toinen for-mallikoodi

Analyysi:
Range-funktion asetukset voivat olla myös näin: range(alkuarvo, stop-arvo, askellus)
jolloin range generoi luvut alkuarvosta stop-arvoa edeltävään arvoon ja
askellus on luku joka lisätään alkuarvoon testin jälkeen ja jos ei saavuteta stop-arvoa, ajetaan koodi.

Koodissa ajettavien silmukoiden lukumäärä asetetaan range-funktiolla,
** ne aloitetaan nollasta ellei toisin määrätä, määrätään toisin, alussa i=2
** askelletaan yksi askel kerrallaan, ellei toisin määrätä, määrätään että askellus on i+3
** päättyy stop-arvoa edeltävään lukuun, stop-arvo tässä mallissa on 20, stop=20-1

Shellissä näet ajotuloksen, alkuarvo oli 2, askellus 3 ja stop-arvoa edeltävä luku 17.
Toimiihan se!

Jos lukujonon halutaan alkavan jostain luvusta, ja askellus on oletus eli +1,
voidaan range määritellä esim näin: range(3, 6), jolloin lukujono on 3, 4, 5.
Kokeile omia versioita.

 

For-silmukka ja time-kirjastotiedosto
Opetellaan pikkuhiljaa tuntemaan myös kirjastotiedostoja.
Kirjastot sisältävät valmista koodia eri tarkoituksiin, ja tässä näet kuinka helppoa niiden käyttö on.

Time
Jotta saisimme helpolla kulutettua aikaa sekunnin verran, otetaan käyttöön kirjastotiedosto,
jossa on aikaan liittyvää valmista koodia. 
Ohjelman alkuun kirjoitetaan määre:
import time
jolla saadaan käyttöön time moduulissa oleva funktio time.sleep(p) funktio.
Parametrille p:lle annetaan viivettä kuvaava arvo, meidän tapauksessa 1,
joka vastaa yhden sekunnin viivettä, luku 2 vastaa 2 sek jne.
Ohjelma pysähtyy tässä kohtaa sekunnin ajaksi.

Aja koodi ja katso miten se toimii.
Kokeile muitakin arvoja, esim 0.5. Huomaa desimaali-piste, ei siis pilkku.

Muista:
Kuten kaikki muutkin lohkot, for-lohko alkaa kaksoispisteellä.
Lohkossa oleva koodi on sisennettyä.
Lohko päättyy sisennyksen loppumiseen.

No kun Python aloittaa laskemisen nollasta (0), tässä alkuarvo on 1.
Eli, jos halutaan tehdä for-looppi 5 kertaa, tässä mallissa annetaan range-funktiolle arvo (1, 6).
Jotta kierroksia olisi tuo viisi, niin silloin on lopetettava ajoissa; 1,2,3,4,5, eikös tuossa ole viisi?

Harjoitus
Tutki mitä tapahtuu kun vaihdat koodiin rangen parametreiksi:
ensin (0, 11)
ja sitten (11)
ja vielä (2, 12, 2)
- keksi itse lisää

 

Paluu pääsivulle:

 

© 2024 Tekijät ja Käsityö verkossa Ry

Punomo.fi:n opetus- ja kaupalliseen käyttöön vaaditaan lisenssi. Lue lisää!