Olemme käyttäneet tällä ohjelmointikurssilla aikaisempien aiheiden yhteydessä lukuisia valmiita funktioita, kuten input, round, floor, ceil, range ja print. Funktiot ovat olleet luonteva osa ongelmanratkaisua, vaikka emme ole toistaiseksi kiinnittäneet niihin suurta huomiota tai toteuttaneet omia funktioita.

Tällä kertaa perehdymme tarkemmin omien funktioiden toteuttamiseen ja kutsumiseen sekä siihen, miten voimme välittää arvoja funktioille ja takaisin.

Syitä oman ohjelman jakamiseksi useisiin funktioihin on lukuisia. Ensinnäkin niiden avulla voidaan vähentää toisteisuutta, jos samoja operaatioita tehdään useita kertoja tai useissa eri kohdissa koodia. Toiseksi funktioiden avulla voidaan vähentää kompleksisuutta, eli pilkkoa iso monimutkainen kokonaisuus pienemmiksi, helpommin ymmärrettäviksi paloiksi.

Sisällysluettelo

Suositeltavaa luettavaa

Johdatus funktioihin

Seuraavalla videolla esitellään funktioiden kirjoittamisen hyötyjä sekä funktioihin liittyvää käsitteistöä:

Edellä esitetyn videon teoria laitetaan käytäntöön tällä videolla, jolla näet funktioiden konkreettisen toteutuksen VS Code -editorissa:

Funktioiden määrittely

Pythonin funktiot muistuttavat hyvin suuresti esimerkiksi JavaScriptin funktioita. Parametrien ja paluuarvojen välitys tapahtuu samalla tavoin, ainoastaan syntaksissa on pieniä eroja:

def laske_summa(lista_numeroista):
    summa = 0
    for n in lista_numeroista:
        summa += n
    return summa

Pythonista löytyy paljon perusoperaatioita myös valmiina, eli oman laske_summa-funktion sijaan voimme kutsua Pythonin valmista sum-funktiota.

Funktion parametrit

Seuraa video esittelee parametrien määrittelemistä funktioille, sekä parametrien oletusarvoja.

Parametrin välittäminen funktiolle

Palataan edellisellä viikolla esitettyyn esimerkkiin, jossa tietyn otsikon jälkeen tulostettiin otsikon pituuden verran =-merkkejä tulostetun otsikon korostamiseksi:

otsikko = 'Parametrin välittäminen funktiolle'

print(otsikko)
print('=' * len(otsikko))

Jos oletamme, että ohjelmassamme eri kohdissa tulostaa otsikoita, ei tätä koodia kannata kopioida, vaan se kannattaa toteuttaa funktioksi. Toteuttaminen funktiona helpottaa koodin luettavuutta, koska funktion nimi kertoo sen toiminnasta ilman teknisiä yksityiskohtia:

tulosta_otsikko('Parametrin välittäminen funktiolle')

Funktio myös parantaa ylläpidettävyyttä, koska mahdolliset tulevat muutokset täytyy tehdä ainoastaan yhteen paikkaan koodissa.

tulosta_otsikko-funktiomme otsikossa, sulkujen sisällä, on määriteltävä se parametrimuuttuja, johon funktiolle annettava merkkijono asetataan. Tämä muuttuja on voimassa ainoastaan funktion sisällä ja se vaihtelee jokaisella suorituskerralla funktiokutsussa välitetyn merkkijonon mukaan:

def tulosta_otsikko(otsikko):
    print(otsikko)
    print('=' * len(otsikko))

Tätä funktiota voidaan nyt kutsua eri puolilta koodia eri arvoilla, ja se tulostaa sille annetut tekstit sekä tekstiin liittyvän korostuksen:

tulosta_otsikko('Johdatus funktioihin')

print() # Tyhjä rivi otsikoiden väliin

tulosta_otsikko('Parametrin välittäminen funktiolle')
Johdatus funktioihin
====================

Parametrin välittäminen funktiolle
==================================

Pythonin moduulit ja paketit

Ulkoisen moduulin hyödyntäminen: random

Oletetaan seuraavaksi, että haluamme luoda satunnaisia salasanoja generoivan Python-ohjelman. Tämän ohjelman apuna voimme käyttää Pythonin valmista random-moduulia:

import random

Random-moduulista löytyy meille erityisen hyödyllinen funktio, random.choice, joka palauttaa sille annetusta merkkijonosta yhden satunnaisen merkin. Kutsumalla tätä funktiota toistuvasti saamme muodostettua lopulta haluamamme pituisen satunnaisen salasanan:

import random

pienet_kirjaimet = 'abcdefghijklmnopqrstuvwxyzåäö'
isot_kirjaimet = pienet_kirjaimet.upper()
numerot = '0123456789'
erikoismerkit = '<>,;.:-!\"#¤$%&/\\()[]'

def anna_satunnainen_merkki():
    merkit = pienet_kirjaimet + isot_kirjaimet + numerot + erikoismerkit
    return random.choice(merkit)  # palauttaa yhden satunnaisen merkin

def generoi_salasana(pituus=20):
    salasana = ''

    while len(salasana) < pituus:
        salasana += anna_satunnainen_merkki()
    
    return salasana

print(f'Salasana 1: {generoi_salasana()}')
print(f'Salasana 2: {generoi_salasana()}')

print(f'Vahva salasana: {generoi_salasana(128)}')

Tässä esimerkissä salasanan generointi funktiossa on erityisen hyödyllistä, koska voimme nyt generoida lukuisia salasanoja ilman että joudumme toistamaan koodia. Voimme myös parametrin avulla määritellä generoitavan salasanan pituuden.

Exra: Virtual Environments

Mikäli kehität käyttöjärjestelmälläsi useita erillisiä Python-projekteja, voi niiden ristiriitaisista riippuvuuksista syntyä ongelmia. Seuraavat videot käsittelevät Pythonin virtuaalisia ympäristöjä, jotka mahdollistavat Python-projektisi eristämisen muista projekteista siten, että jokainen projekti asentaa riippuvuudet yhteisen hakemiston sijasta omaan virtuaaliseen ympäristöönsä.

Videon ohjeesta poiketen sinun ei tarvitse asentaa venv-pakettia erikseen, koska se tulee valmiiksi mukana nykyisissä Python-versioissa.

Videoiden lisenssi

Tässä oppimateriaalissa hyödynnetyt Microsoftin Python for Beginners -videosarjan videot on lisensoitu Creative Commons Attribution-Noncommercial-No Derivative Works 4.0 International -lisenssillä.