Tie koodariksi

Ohjelmoinnin alkeet

Luku 16: Funktiot

Olemme käyttäneet kurssin aikana monia Pythonin valmiita funktioita, kuten print, range ja len. Entä jos haluaisimme tehdä itse vastaavia funktioita?

Funktion luominen

Voimme luoda oman funktion sanan def avulla. Esimerkiksi seuraavassa ohjelmassa on funktio testi, joka tulostaa tekstin "Moikka!". Ohjelma kutsuu funktiota kolme kertaa.

def testi():
    print("Moikka!")

testi()
testi()
testi()

Ohjelman tulostus on seuraava:

Moikka!
Moikka!
Moikka!

Parametrit

Funktiolla on usein yksi tai useampi parametri, joiden kautta sille voi välittää tietoa. Esimerkiksi seuraavassa funktiossa portaat on parametri n, joka ilmaisee, kuinka korkean portaikon haluamme tulostaa. Kutsumme funktiota kahdesti parametreilla 3 ja 5.
def portaat(n):
    for i in range(1,n+1):
        print("#"*i)

portaat(3)
portaat(5)

Ohjelma antaa seuraavan tuloksen:

#
##
###
#
##
###
####
#####

Palautusarvo

Funktio voi myös palauttaa jonkin arvon kutsukohtaan. Tällöin käytämme funktiossa komentoa return, joka poistuu funktiosta ja palauttaa arvon.

Esimerkiksi seuraavassa ohjelmassa funktio summa laskee lukujen a...b summan:

def summa(a,b):
    s = 0
    for x in range(a,b+1):
        s += x
    return s

print(summa(1,5))
print(summa(8,9))

Ohjelma laskee summat 1+2+3+4+5 = 15 ja 8+9 = 17:

15
17

Rekursio

Voimme käyttää funktioissa myös rekursiota, mikä tarkoittaa, että funktio kutsuu itseään. Näin on seuraavassa funktiossa, joka laskee lukujen a ja b suurimman yhteisen tekijän Eukleideen algoritmilla:
def syt(a,b):
    if b == 0:
        return a
    else:
    	return syt(b,a%b)

print(syt(4,6))
print(syt(9,14))
print(syt(24,60))
Ohjelman tulostus on seuraava:
2
1
12

Tehtävä 1 Ratkaisematon

Toteuta komento rivi, joka tulostaa rivin, jossa on peräkkäin n tähteä. Liitä komento osaksi seuraavaa ohjelmaa, joka myös testaa komentoasi:

def rivi(n):
    # toteuta komento tähän

rivi(5)
rivi(10)
rivi(8)

Ohjelman tulostuksen tulee olla seuraava:

*****
**********
********

Kirjoita ohjelma tähän:


Tehtävä 2 Ratkaisematon

Toteuta komento laatikko, joka tulostaa sille annetun tekstin laatikossa, jonka reunat ovat tähtiä. Liitä komento osaksi seuraavaa ohjelmaa, joka myös testaa komentoasi:

def laatikko(teksti):
    # toteuta komento tähän

laatikko("apina")
laatikko("banaani")
laatikko("cembalo")

Ohjelman tulostuksen tulee olla seuraava:

*********
* apina *
*********
***********
* banaani *
***********
***********
* cembalo *
***********

Kirjoita ohjelma tähän:


Tehtävä 3 Ratkaisematon

Toteuta funktio kertoma, joka laskee luvun n kertoman. Liitä funktio osaksi seuraavaa ohjelmaa, joka myös testaa funktiotasi:

def kertoma(n):
    # kirjoita funktio tähän

print(kertoma(3))
print(kertoma(5))
print(kertoma(9))

Ohjelman tulostuksen tulee olla seuraava:

6
120
362880

Kirjoita ohjelma tähän:


Tehtävä 4 Ratkaisematon

Toteuta funktio summa, joka laskee sille annetun listan lukujen summan. Liitä funktio osaksi seuraavaa ohjelmaa, joka myös testaa funktiotasi:

def summa(lista):
    # kirjoita funktio tähän

print(summa([1,2,3]))
print(summa([5,1,7,2,5]))
print(summa([4]))

Ohjelman tulostuksen tulee olla seuraava:

6
20
4

Kirjoita ohjelma tähän:


Tehtävä 5 Ratkaisematon

Toteuta funktio peilaus, joka kääntää sille annetun tekstin väärinpäin. Liitä funktio osaksi seuraavaa ohjelmaa, joka myös testaa funktiotasi:

def peilaus(teksti):
    # kirjoita funktio tähän

print(peilaus("apina"))
print(peilaus("banaani"))
print(peilaus("cembalo"))

Ohjelman tulostuksen tulee olla seuraava:

anipa
inaanab
olabmec

Kirjoita ohjelma tähän:


Tehtävä 6 Ratkaisematon

Toteuta funktio tekijat, joka palauttaa listan, jossa on luvun n alkutekijät pienimmästä suurimpaan. Liitä funktio osaksi seuraavaa ohjelmaa, joka myös testaa funktiotasi:

def tekijat(n):
    # kirjoita funktio tähän

print(tekijat(6))
print(tekijat(7))
print(tekijat(8))
print(tekijat(980))
print(tekijat(12345))

Ohjelman tulostuksen tulee olla seuraava:

[2, 3]
[7]
[2, 2, 2]
[2, 2, 5, 7, 7]
[3, 5, 823]

Kirjoita ohjelma tähän: