Funktiot


Luentovideo

Pääohjelma

Olemme tähän asti kirjoittaneet ohjelmakoodia vapaasti tekstieditoriin. Python on osannut sen meille kääntää ja ajaa. Kuitenkin jos lähdetään rakentamaan isompia kokonaisuuksia tai vaikka apuohjelmia muiden käyttöön, tulee käyttää Python-ohjelman perusrunkoa:

          def main():
    print("Hello world!")

if __name__ == "__main__":
    main()
        

Perusrunko voi olla jo tuttu jostain materiaalin koodiesimerkistä, mutta käydään se vielä kerran läpi. If-ehto ohjelman lopussa tarkistaa ensin onko ohjelmakoodimme tuotu (=import) osaksi jotain muuta ohjelmaa. Puhutaan tästä lisää viimeisessä kappaleessa. Jos ohjelma ajetaan itsenäisenä, yksittäisenä ohjelmana eikä ole osa jotain muuta ohjelmaa, niin suoritetaan main()-funktio. Tällä hetkellä main()-funktio tulostaa: "Hello world!".

1. Välitehtävä: Kokeile korjata jokin aikaisempi ohjelmakoodisi noudattamaan noudattamaan Python-ohjelman perusrunkoa.

Funktiot/aliohjelmat

Python-kielessä, kuten kuten myös monessa muussakin kielessä kannattaa ohjelman yhtä asiaa tekevät osaset kirjoittaa omiksi funktioikseen. Funktiot parantavat koodin luettavuutta, mutta samalla myös selkeyttävät ohjelmoijan ajattelua. Funktioita voi kutsua mistä tahansa kohtaa ohjelmakoodia. Pythonissa uusi funktio esitellään:

          def uusiFunktio():
    # Tänne tulee funktion toiminta
    # Päätä funktio esittely "":"-merkkiin
    # Ja muista sisentää alle tulevat rivit
        

Ja sitä kutsutaan ohjelmakoodissa:

          # ...            
# Muuta koodia            
uusiFunktio() # Jos aliohjelma "uusiFunktio()" palauttaisi jotain otettaisiin se kiinni johonkin muuttujaan esim. tulos = uusiFunktio()
# Muuta koodia
# ...
        

Seuraavassa esimerkissä edellinen teoria on viety käytäntöön. Molemmat esimerkin aliohjelmat ottavat myös arugmentteja/parametreja mukaansa eli toisin sanoen kuljettavat muuttujia paikasta toiseen. Ilman näitä parametreja aliohjelmat eivät pääse käsiksi muuttujiin. Jotkin aliohjelmat, kuten tässä tapauksessa aliohjelma nimeltä "tervehdi()" eivät palauta mitään, eli ohjelma ei pääty "return"-lauseeseen. "tervehdi()" -aliohjelma siis vain tervehtii sille parametrina tuotua nimeä ja ohjelma on siinä. laskeYhteen() -aliohjelma taas sisältää return-lauseen, joka tuo tuloksen (tässä tapauksessa kahden luvun summan) takaisin sinne mistä aliohjelmaa kutsuttiin:

          # tervehdi() -funktio saa nimen parametrina
def tervehdi(nimi):
    print("Morjesta päivää " + nimi + "!")

# laskeYhteen() -funktio saa kaksi lukua parametrinaan
def laskeYhteen(luku1, luku2):
    summa = luku1 + luku2
    return summa

# Pääohjelma main(), josta aliohjelmia kutsutaan
def main():
    nimi = "Kaspar"
    tervehdi(nimi)

    a = 2
    b = 3
    summa = laskeYhteen(a, b)
    print(summa)


if __name__ == "__main__":
    main()
        

2. Välitehtävä: Kokeile kirjoittaa Pythonin perusrunkoa noudattava ohjelma, jossa kutsut pääohjelmasta itse tehtyä funktiota. Tämä funktio on nimeltään "kolmenSumma()" ja se ottaa parametrina kolme lukua. Nämä kolme lukua lasketaan aliohjelmassa yhteen ja palautetaan tulos takaisin return -lauseella. Pääohjelmassa tulos otetaan kiinni ja tulostetaan konsoliin.

2. välitehtävän esimerkkivastaus
            # Funktio nimeltä kolmenSumma, joka laskee sille tuodut parametrit yhteen ja palauttaa tuloksen
# Huomaa, ettei muuttujien nimillä ole mitään väliä :)
def kolmenSumma(kissa, koira, hevonen):
    vastaus = kissa + koira + hevonen
    return vastaus

def main():
    eka_luku = 4
    toka_luku = 10
    kolmas_luku = 28

    # Kutsutaan funktiota kolmenSumma() muuttujilla ja otetaan palautus kiinni muuttujaan "yhteenlaskettu_summa"
    yhteenlaskettu_summa = kolmenSumma(eka_luku, toka_luku, kolmas_luku)
    # Tulostetaan vastaus
    print(yhteenlaskettu_summa)
    

if __name__ == "__main__":
    main()
          

Pythonin omat funktiot ja hieman moduuleista (kirjastoista)

Olemme aikaisemmin materiaalissa huomanneet, että pythonista löytyy jo natiivisti paljon erilaisia funktioita käsittelemään esimerkiksi merkkijonoja ja taulukoita. Valmiiksi löytyvien funktioiden lisäksi Pythoniin, kuten myös muihinkin ohjelmointikieliin on mahdollista tuoda ulkopuolisia moduuleja ja kirjastoja. Kirjasto tarkoittaa Pythonissa moduulien kokoelmaa. Pythonissa ulkopuolinen moduuli tai kirjasto tuodaan mukaan kirjoittamalla ohjelmakoodin alkuun import ja perään moduuli/kirjasto, joka halutaan tuoda. Esimerkiksi satunnaisuus-moduuli voidaan tuoda osaksi Python-koodia seuraavalla tavalla:

          # Tuodaan ohjelman alussa moduuli random osaksi ohjelmaa 
import random

def main():
    # Hyödynnetään "random"-moduulin funktiota randint ja 
    # generoidaan satunnainen luku väliltä 1-10 otetaan se myös talteen
    # muuttujaan "random_luku_1_viiva_10" 
    random_luku_1_viiva_10 = random.randint(1, 10)
    # Tulostetaan satunnainen luku
    print(random_luku_1_viiva_10)


if __name__ == "__main__":
    main()
        

3. Välitehtävä: Kokeile tuoda moduuli nimeltä "math" osaksi alla olevaa esimerkkikoodia ja ratkaise muuttujien a, b ja c neliöjuuri. Vinkki: math.sqrt(muuttuja)

          def main():
    a = 9
    b = 134
    c = 0.78
    

if __name__ == "__main__":
    main()
        
3. välitehtävän esimerkkivastaus
            # Tuodaan "math"-moduuli import komennolla
import math

def main():
    a = 9
    a = math.sqrt(a) # Lasketaan muuttujan neliöjuuri math-moduulin .sqrt()-funktiolla ja tehdään uudelleensijoitus
    print(a)

    b = 134
    b = math.sqrt(b) 
    print(b)

    c = 0.78
    c = math.sqrt(c)
    print(c)

if __name__ == "__main__":
    main()