Yleistä
Ohjausrakenteilla ohjataan komentojen suoritusjärjestystä:
Python-kielessä on kaksi toistorakennetta; alkuehtoinen for sekä avoin while.
Toistorakenne on yhdistelmä peräkkäis- ja ehtorakennetta.
Koodissa toistetaan peräkkäisiä käskyjä kunnes ehto täyttyy ja päästään ulos silmukasta.
Ei sen ihmeellisempää ole.
Silmukan suurin etu on se, että se vähentää kirjoitettavan koodin määrää.
Kun ei tiedetä tarkkaan, montako kertaa lohkon käskysarjaa pitää toistaa, käytetään while-lausetta.
Siinä toistetaan käskysarjaa niin kauan kuin annettu ehto on tosi.
While-lauseen tarve testataan ennen silmukkaan menoa.
Siksi on mahdollista, että silmukkaa ei koskaan käydä läpi, eikä sen käskyjä suoriteta.
while-silmukka.
while-silmukan formaatti:
while (ehto):
# tee jotain, lohko
ohjelma jatkuu
Lohko päättyy sisennyksen loppumiseen.
Kaarisulkujen sisällä on testi- eli jatkamisehto.
Jos ehto on epätosi, siirrytään suoraan ohjelmassa eteenpäin.
Mikäli ehto on tosi, suoritetaan lohko ja palataan uudelleen ehdon testaamiseen.
Silmukassa ollaan, kunnes ehto on epätosi.
Lopetusehto tarkistetaan aina ennen ensimmäistä toimenpidettä ja aina,
kun ollaan lohkon käskyrivien lopussa.
Ehto on useimmiten vertailulauseke.
Kuten kaikki lohkot, while:n lohko alkaa kaksoispisteellä.
Lohkossa oleva koodi on sisennettyä ja lohko päättyy sisennyksen loppumiseen.
Silloin lopetaan while-käskyn suoritus ja siirrytään ohjelmassa eteenpäin.
While-mallikoodi
kirjoita oheinen koodi RasPin Thonny-editorissa ja aja se,
kunhan ensin olet lukenut kuvan alla olevan koodianalyysin.
Analyysi
While-lausetta suoritetaan niin kauan kuin annettu ehto (i<6) on tosi,
ts. niin kauan kuin i on pienempi kuin 6.
Joka kierroksella i:n arvoa lisätään yhdellä eli inkrementoidaan.
Jossain vaiheessa i ei enää ole pienempi kuin 6, jolloin ehto ei enää ole tosi ja tullaan ulos silmukasta.
Jatkamisehto tarkistetaan jokaisen kierroksen alussa, myös ensimmäisen.
Jos ehto ei ensimmäisellä tarkistuksella ole totta, niin silmukkaa ei ajeta lainkaan.
Silloin koodin ajaminen jatkuu lohkon jälkeen eli ensimmäisestä sisentämättömästä rivistä.
Toisin kuin for-loopissa, while-loopissa suorituskertojen määrää ei tarvitse tietää ennakkoon.
Jatkamisehdossa olevan muuttujan pitää olla olemassa jo ennen ensimmäistä kierrosta,
eihän sitä muuten päästä testaamaan.
Varmista, että jatkamisehto muuttuu jossakin vaiheessa epätodeksi,
muuten jäädään ns. ikuiseen silmukkaan.
Se ei lopu koskaan. Siitä on mallihajoitus.
time
Jotta saisimme ”eloa” (pieni viive) tulostukseen otetaan käyttöön kirjastotiedosto,
jossa on aikaan liittyvää valmista koodia. Ohjelman alkuun kirjoitetaan määre:
import time
jolla saadaan käyttöön funktio time.sleep(p), jossa p:lle annetaan arvo, meidän tapauksessa 1.
Mutta kokeilet tietysti muitakin arvoja, esim 0.5.
Huomaa desimaali-piste ei -pilkku.
Muista:
Kuten kaikki muutkin lohkot, while-lohko alkaa kaksoispisteellä.
Lohkossa oleva koodi on sisennettyä.
Lohko päättyy sisennyksen loppumiseen.
Sijoitus-merkki = on eri asia kuin yhtäsuuruus ==.
Toinen while-harjoitus
Silmukkalaskuri toimii myös alaspäin.
Jos ymmärrät edellisen mallikoodin toiminnan, tämän version toiminta on ”selvää pässin lihaa”.
Arvaus ja while-silmukka
Seuraavassa harjoituksessa käytetään kaikkea tähän mennessä opittua while-silmukan lisäksi.
Ohjelma pyörii while-silmukassa (oma lohko running) kunnes käyttäjä osaa arvata oikean luvun.
Ole erittäin tarkka koodin kirjoituksen kanssa, jotta sisennykset tulevat varmasti oikein.
Ellei sisennys ole oikein, koodi ei toimi ja sen toiminnan ymmärtäminen on vaikeaa.
Huomaa, että while-lohkoon kuuluu kaikki koodi joka on sisennetty.
Katso tarkkaan mallikoodia while- ja viimeisen else-komennon osalta, niitä ei ole sisennetty,
sillä ne muodostavat kumpikin oman lohkonsa.
While-ehto (running) on asetettu olemaan tosi, True, jo ennenkuin mennään itse silmukkaan.
Se muuttuu epätodeksi vasta kun arvaus on oikein ja sen seurauksena tullaan ulos while-loopista.
Ikuinen silmukka, Infinite loop
Ole huolellinen while-loopin silmukkalaskurin kanssa.
Väärä määrittely ja olet tehnyt pahan mokan, ikuisen silmukan.
Silmukkalaskurin testi on aina tosi, palataan tekemään koodia, alituisesti, lakkaamatta.
Tosi on.
Analyysi:
Silmukkalaskuria ei koodissa päivitetä, joten laskurin arvo on aina 3 ja while-ehto on aina tosi, eli pienempi kuin 5.
Ohjelma pysähtyy kun painat Shellissä, johon se tulostaa, CTRL + c.
Siirrä hiiren kursori ensin Shelliin ja sitten stop toimii.