Lisää silmukoista
break-komento
Aiemmin silmukoiden yhteydessä tutustuttiin break
-komentoon. Komennolla voidaan katkaista silmukan suoritus välittömästi. Tyypillinen esimerkki komennon käytöstä on silmukka, jossa kysytään käyttäjältä syötteitä, ja suoritus päättyy, kun käyttäjä antaa tietyn syötteen.
Vastaavaan toiminnallisuuteen päästään myös ilman break
-komentoa sopivan ehdon avulla. Alla olevat esimerkit toteuttavat molemmat ohjelman, joka laskee käyttäjän syötteiden summan kunnes käyttäjä syöttää luvun -1:
# 1. versio break-komennon avulla
summa = 0
while True:
luku = int(input("Anna luku, -1 lopettaa: "))
if luku == -1:
break
summa += luku
print (f"Summa on {summa}")
# 2. versio ilman break-komentoa
summa = 0
luku = 0
while luku != -1:
luku = int(input("Anna luku, -1 lopettaa: "))
if luku != -1:
summa += luku
print (f"Summa on {summa}")
Molempien ohjelmien esimerkkisuoritus voisi näyttää seuraavalta:
Anna luku, -1 lopettaa: 2 Anna luku, -1 lopettaa: 4 Anna luku, -1 lopettaa: 5 Anna luku, -1 lopettaa: 3 Anna luku, -1 lopettaa: -1 Summa on 14
Molemmat versiot ovat toiminnallisuudeltaan siis käytännössä samanlaisia. Ensimmäinen tapa on kuitenkin usein helpompi, koska ehto luku == -1
riittää kirjoittaa vain kerran eikä muuttujaa luku
tarvitse alustaa silmukan ulkopuolella.
Komentoa break
voidaan käyttää myös silloin, kun silmukassa on annettu jokin muu ehto kuin pelkkä totuusarvo True
. Esimerkiksi seuraava silmukka jatkuu niin kauan, kuin annettujen lukujen summa on enintään 100. Kuitenkin silmukka katkeaa myös, jos käyttäjä antaa luvun -1.
summa = 0
while summa <= 100:
luku = int(input("Anna luku, -1 lopettaa: "))
if luku == -1:
break
summa += luku
print (f"Summa on {summa}")
Mahdollisia suorituksia:
Anna luku, -1 lopettaa: 15 Anna luku, -1 lopettaa: 8 Anna luku, -1 lopettaa: 21 Anna luku, -1 lopettaa: -1 Summa on 44
Anna luku, -1 lopettaa: 15 Anna luku, -1 lopettaa: 8 Anna luku, -1 lopettaa: 21 Anna luku, -1 lopettaa: 45 Anna luku, -1 lopettaa: 17 Summa on 106
Ensimmäisessä tapauksessa silmukka päättyy, koska käyttäjä antaa luvun -1. Toisessa tapauksessa silmukka päättyy, koska lukujen summa on yli 100.
Toisaalta voisimme toteuttaa vastaavasti toimivan silmukan myös näin:
summa = 0
while True:
luku = int(input("Anna luku, -1 lopettaa: "))
if luku == -1:
break
summa += luku
if summa > 100:
break
print (f"Summa on {summa}")
continue-komento
Komento continue
on toinen tapa vaikuttaa silmukan suoritukseen. Kun silmukan sisällä tulee vastaan komento continue
, hyppää suoritus välittömästi silmukan alkuun riville, jossa on silmukan ehto. Tämän jälkeen silmukan suoritus jatkuu normaalisti ehdon tarkastamisella:
Esimerkiksi seuraava ohjelma laskee summaan mukaan vain luvut, jotka ovat pienempiä kuin 10. Jos luku on 10 tai suurempi, suoritus palaa silmukan alkuun eikä lukua lisätä summaan.
summa = 0
while True:
luku = int(input("Anna luku, -1 lopettaa: "))
if luku == -1:
break
if luku >= 10:
continue
summa += luku
print (f"Summa on {summa}")
Anna luku, -1 lopettaa: 4 Anna luku, -1 lopettaa: 7 Anna luku, -1 lopettaa: 99 Anna luku, -1 lopettaa: 5 Anna luku, -1 lopettaa: -1 Summa on 16
Sisäkkäiset silmukat
Silmukoita voidaan kirjoittaa toisten silmukoiden sisään. Esimerkiksi seuraava ohjelma kysyy käyttäjältä silmukassa luvun ja tulostaa sen avulla lukujonon toisen silmukan avulla:
while True:
luku = int(input("Anna luku: "))
if luku == -1:
break
while luku > 0:
print(luku)
luku -= 1
Anna luku: 4 4 3 2 1 Anna luku: 3 3 2 1 Anna luku: 6 6 5 4 3 2 1 Anna luku: -1
Huomaa, että kun silmukoita on sisäkkäin, komennot break
ja continue
vaikuttavat vain sisimpään silmukkaan. Esimerkiksi voisimme toteuttaa äskeisen ohjelman vähän eri tavalla myös näin:
while True:
luku = int(input("Anna luku: "))
if luku == -1:
break
while True:
if luku <= 0:
break
print(luku)
luku -= 1
Nyt jälkimmäinen break
-komento keskeyttää vain sisimmän silmukan, joka tulostaa lukuja, jos ehto luku <= 0
pätee.
Silmukoiden apumuuttujat
Olemme jo monesti käyttäneet silmukoissa apu- tai indeksimuuttujaa, jonka arvo kasvaa tai laskee jokaisella silmukan lohkon suorituskerralla. Esimerkiksi seuraava ohjelma tulostaa parilliset luvut käyttäjän haluamaan lukuun asti:
raja = int(input("Anna luku: "))
i = 0
while i < raja:
print(i)
i += 2
Anna luku: 8 0 2 4 6
Apumuuttujan i
arvo on silmukkaan ensimmäistä kertaa mentäessä 0 ja se kasvaa jokaisella silmukan suorituskerralla kahdella.
Sisäkkäisten silmukoiden tapauksessa on tilanteita, joissa sisempi silmukka tarvitsee oman indeksimuuttujansa. Seuraava ohjelma tulostaa käyttäjän antamaan lukuun perustuvan "lukupyramidin":
luku = int(input("Anna luku: "))
while luku > 0:
i = 0
while i < luku:
print(f"{i} ", end="")
i += 1
print()
luku -= 1
Anna luku: 5 0 1 2 3 4 0 1 2 3 0 1 2 0 1 0
Nyt sisemmässä silmukassa on käytössä apumuuttuja i
, jonka arvo on aina sisempään silmukkaan mentäessä 0. Muuttujan i
arvo kasvaa yhden välein, kunnes se on yhtä suuri kuin muuttujan luku
nykyinen arvo, joka taas vähenee ulomman silmukan vuoksi kohti nollaa.
Sisempi silmukka tulostaa apumuuttujan i
arvot välilyönnillä eroteltuna samalle riville. Kun sisempi silmukka päättyy, tulostetaan aina rivinvaihto komennolla print
.
Jos et ole täysin varma, että ymmärrät esimerkkikoodin toiminnan, kokeile kopioida koodi Python Tutorin visualisaattoriin ja tarkastele, mitä ohjelma tulostaa ja miten muuttujien arvot vaihtuvat koodin edetessä.
Log in to view the quiz