Ehtolauseet ja silmukat


Luentovideo

Ehtolauseet

Ehtolauseet ovat tärkeä osa ohjelmakoodia. Ilman ehtolauseita kaikki ohjelmat rullaisivat aina samalla kaavalla alusta loppuun asti. Kuvittele esimerkiksi, että pelaat videopeliä, jossa ei ole mahdollista hävitä. Tai jos salasanaasi ei tarkistettaisi ennen kirjautumista. Ehtolauseet muuttavat siis ohjelman toimintaa, niin että erilaisiin tilanteisiin voidaan reagoida eri tavoin. Esimerkki konkreettisesta oikeaan elämään liittyvästä ehtolauseesta voisi olla:

jos ulkona sataa vettä, niin laita kumisaappaat.

Syntaksiltaan Pythonissa ehtolause eli if-rakenne näyttää kaikessa yksinkertaisuudessaan tältä:

          x = 2                               # Muuttujaan "x" sijoitetaan luku 2
if x < 0:                           # Tarkistetaan onko muuttuja "x" pienempi, kuin luku 0  
    print("luku on negatiivinen")   # Jos edellisen rivin ehto piti paikkansa, niin tulostetaan "luku on negatiivinen"
        

Jos edellisen esimerkin ehto ei toteudu, niin sisennettyä koodilohkoa ei suoriteta. Toteutuessaan se taas suoritetaan. Jos taas halutaan tehdä jotain ainoastaan siinä tapauksessa, että ehto ei toteudu, voidaan käyttää "else"-rakennetta. Toisin sanoen ja taas oikean elämän esimerkkiä hyödyntäen:

jos jotain, niin... muuten näin...

Else-rakennetta käytetään Pythonissa näin:

          x = 2                               # Muuttujaan "x" sijoitetaan luku 2
if x < 0:                           # Tarkistetaan onko muuttuja "x" pienempi, kuin luku 0  
    print("luku on negatiivinen")   # Jos edellisen rivin ehto piti paikkansa, niin tulostetaan "luku on negatiivinen"
else:                               # Jos äskeinen ehto ei pitänyt paikkaansa niin suoritetaan seuraavan rivin sisennys
    print("luku on positiivinen")   # Tulostetaan "luku on positiivinen"
        

Lisäehtoja "jossitteluun" voi lisätä elif-rakenteella (else if):

          x = 2                               
if x < 0:                             
    print("luku on negatiivinen")   
elif x > 0:                         
    print("luku on positiivinen")
else:
    print("luku on nolla")
        

Yleensä ohjelmakoodissa ehtolauseita käytetään osana muita rakenteita, jotta ohjelmakoodi osaa tehdä päätöksen siitä, mitä tehdään. Kuten tulet varmasti huomaamaan if-rakenne on todella tärkeä. Vertailuoperaattoreita, joilla muuttujia voi vertailla on Pythonissa muutama:

1. Välitehtävä: Tehtävänäsi on koodata ohjelma, joka kysyy salasanaa käyttäjältä. Jos käyttäjä syöttää oikean salasanan, hänelle tulostetaan teksti "Tervetuloa!". Jos salasana on väärin, niin tulostetaan "Väärä salasana". Oikea salasana on "katapultti13".

1. Välitehtävän esimerkkivastaus
            ss = input("Anna salasana: ")
if ss == "katapultti13":
    print("Tervetuloa!")
else:
    print("Salasana on väärin")
          

Silmukat (ja lyhyt sana listoista)

Silmukat eli toistorakenteet vähentävät koodin kirjoittamista huomattavasti. Lisäksi ne ovat oiva tapa käydä läpi suurempiakin datamääriä. Toistorakenteella tarkoitetaan ohjelmakoodin rakennetta, jossa ohjelmakoodi toistaa samaa koodinpätkää, kunnes sille asetettu ehto käy toteen. Taas käytännön elämästä johdettu esimerkki:

syödään lounasta niin kauan, kunnes maha on täynnä.

Listat

Listat ovat Pythonin vastine taulukoille. Etenkin kun käsittelyssämme on silmukat, on oikea hetki mainita listoista, sillä listoja usein käydään läpi silmukoilla. Edellisen kappaleen lopulla oli esimerkki, jossa ohjelma laski listasta löytyvien alkioiden keskiarvon. Tässäkin esimerkissä lista suhattiin läpi silmukkaa hyödyntäen. Pythonissa lista esitellään ilmoittamalla listan alkiot hakasulkeissa:

          juomat = ["Kahvi", "Kokis", "Tee", "Mehu"]
        

Listan alkioon pääsee käsiksi hakasulkeilla ja ilmoittamalla indeksin hakasulkeiden sisään. Toisin sanoen missä kohtaa listaa alkio on. Esimerkiksi: kohdasta juomat[0] löytyy "Kahvi". Mitä löytyy paikasta juomat[2]? MUISTA taulukon indeksointi alkaa Pythonissa aina nollasta!

Listoille on myös paljon erilaisia metodeja, aivan kuten merkkijonoillekin. Voisikin ajatella, että merkkijonotkin ovat kuin listoja merkeistä, joissa jokainen merkki on yksi listan alkio. Esimerkkejä listoihin liittyvistä metodeista:

2. Välitehtävä: Kopioi yllä esitelty "juomat"-lista tekstieditoriisi. Ja 1) Lisää listaan alkio "Vesi" 2) Poista listasta alkio "Kokis" 3) Tarkista kuinka monta alkiota listassa on?

2. Välitehtävän esimerkkivastaus
          juomat = ["Kahvi", "Kokis", "Tee", "Mehu"]

# Luodaan uusi muuttuja, jonka arvona on "Vesi"
lisattava = "Vesi"
# Lisätään muuttuja uudeksi alkioksi listaan
juomat.append(lisattava)

# Poistetaan listasta "Kokis"
juomat.remove("Kokis")

# Otetaan alkioiden määrä talteen uuteen muuttujaan
alkioiden_maara = len(juomat)

print(alkioiden_maara) # 4 (Tulostetaan alkioiden määrä)
print(juomat) # ['Kahvi', 'Tee', 'Mehu', 'Vesi'] (Tulostetaan listan sisältö)
        

For-silmukka

For-silmukka on yksi Pythonin silmukkarakenteista. For-silmukka on erityisen käytännöllinen silloin, kun tarkoituksena on käydä läpi listaa ja sen alkioita yksi kerrallaan. Alla olevassa esimerkkissä on luotu kymmenen alkion mittainen lista, joka sisältää luvut 1-10. Silmukka käy alkiot läpi yksi kerrallaan ja tulostaa

          numerotaulukko = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for numero in numerotaulukko:
    print(numero)
        

Ymmärrätkö miten for-silmukka toimii? Kokeile "vipeltää" aikaisemmin luodun juomat = ['Kahvi', 'Tee', 'Mehu', 'Vesi'] -listan läpi ja tulostaa jokainen alkio yksi kerrallaan.

Range-silmukka

Range-silmukka on myös erittäin käytännöllinen silmukka-rakenne. Se toimii lähes samalla periaatteella kuin for-silmukka. range() -funktioon on kuitenkin mahdollista etukäteen ilmoittaa, kuinka monta kierrosta silmukassa pyöritään. Alla oleva esimerkki tulostaa luvut 1-10:

          for x in range(10):
    print(x)
        

Pääsetkö jyvälle? range()-funktio voi ottaa sisäänsä myös 3 argumenttia, missä argumentit toimivat näin: range(alku, loppu, väli). Esimerkiksi range(0, 10, 3), mikä tulostaisi 0 3 6 9. Kokeile tulostaa range()-silmukkaa hyödyntäen joka kymmenes luku välillä 0-100.

While-silmukka

While-silmukka on mahdollisesti kaikistä yleisin silmukka-rakenne ja vastaavanlainen toiminnallisuus löytyy kielestä, kuin kielestä. While-silmukan logiikka perustuu siihen, että ohjelma pyörii silmukassa siihen asti, kunnes while-avainsanan jälkeinen ehto ei enää ole tosi (True). Alla esimerkki:

          askel = 0            
while askel < 10:
    print(askel)
    askel += 1 # Tämä on sama asia, kuin askel = askel + 1
        

Huomaat varmaan, että askel-muuttujaa pitää kokoajan korottaa, jotta saavutamme joskus ehdon ja teemme siitä epätotta (askel < 10). Eli, kun askel-muuttuja saavuttaa arvon 10, ei while-avainsanan jälkeinen ehto enää pidä paikkaansa ja silmukan suoritus loppuu. Jos koodin viimeistä riviä askel += 1 ei olisi, niin ohjelma tulostaisi lukua 0 loputtomasti. Kyseessä olisi niin kutsuttu ikuinen silmukka.

While-silmukka on erittäin hyödyllinen apuväline, kun sitä oppii käyttämään. Kun emme ennalta tiedä, kuinka monta kertaa jokin asia tulee tehdä, on while-silmukka tässä kohtaa ainut vaihtoehto.

"break" ja "continue"

break ja continue käskyillä voimme ohjailla silmukan käyttäytymistä. break-käsky nimensä mukaisesti poistuu silmukasta, kun taas continue:lla voimme siirtyä silmukassa seuraavalle "kierrokselle". Alla olevassa esimerkissä on kaksi ohjelmaa, jotka auttavat avaamaan, miten käskyt toimivat Pythonissa:

          # Ohjelma tulostaa parittomat luvut alueella 1-10
askel = 0            
while askel < 10:
    askel += 1
    if askel % 2 == 0: # Tarkistetaan onko luku parillinen
        continue # Jos on niin siirrytään seuraavalle kierrokselle
    else:
        print(askel) # Tulostetaan luku


# Ohjelma tulostaa luvut alueella 1-5. Huomaatko miksi luku 5 ei tulostu?
for luku in range(10):
    if luku == 5: # Tarkistetaan onko luku 5
        break # Jos edellinen piti paikkansa, niin poistutaan ohjelmasta
    print(luku)