Antall parametere
Funksjoner har ofte parametere, men de trenger ikke ha det. Da har vi et sett tomme parenteser i funksjonshodet.
Funksjonen i eksempel 1 under har ingen parametere, og benytter funksjonen randint() i modulen random til å simulere et myntkast. Den returnerer så strengen «mynt» eller «kron».
Eksempel 1:
from random import randint
def myntkast():
"""Simulerer et myntkast og returnerer "mynt" eller "kron"."""
if randint(0, 1) == 0:
return "mynt"
else:
return "kron"
Hvis vi i hovedprogrammet skriver print(myntkast()), vil vi få skrevet ut enten mynt eller kron.
Skriv en funksjon som simulerer terningkast, det vil si genererer tilfeldige tall mellom 1 og 6, og returnerer resultatet.
Test funksjonen ved å skrive ut verdien den returnerer.
Rekkefølge på parametere
Hvis vi ikke angir noe annet, koples argumentene vi gir inn til en funksjon, til parameterne i den rekkefølgen de står. La oss for eksempel si at vi har kode som beregner $\sqrt[\Large n]{x}$ ved å benytte at $\sqrt[\Large n]{x} = x^{\Large \frac{1}{n}}$, som i eksempel 2:
Eksempel 2:
def nrot(x, n):
"""Beregner n'te rot av x."""
return x**(1/n)
Hvis vi så i hovedprogrammet skriver nrot(8, 3), vil parameteren x bli 8 og n bli 3, så vi får regnet ut $\sqrt[\Large 3]{8} = 2$.
Bytter vi om argumentene og skriver nrot(3, 8), vil parameteren x bli 3 og n bli 8, så vi får regnet ut $\sqrt[\Large8]{3}\approx1{,}1472$.
Det er mulig å angi parameternavn sammen med argumentene. Hvis vi har funksjonen nrot() som i eksempel 2, kan vi i hovedprogrammet navngi parameterne ved å skrive nrot(x = 8, n = 3) eller nrot(n = 3, x = 8).
Når vi navngir parameterne, spiller ikke rekkefølgen på argumentene noen rolle, fordi navnene overstyrer rekkefølgen.
Som hovedregel bør vi imidlertid holde oss til å bruke rekkefølge til å kople argumenter og parametere. Bruker vi navn, vil koden slutte å virke hvis vi endrer navn på parameterne. Innebygde Python-funksjoner og funksjoner i moduler tillater ofte heller ikke at vi navngir parameterne. Skriver vi for eksempel abs(x = -3), får vi en feilmelding, selv om parameteren i abs() heter x.
Navngitte parametere bør vi reservere til tilfeller der en parameter har en spesiell betydning. Et godt eksempel er Python-funksjonen enumerate(), som vi beskriver i artikkelen om å gjennomløpe lister. enumerate() tillater oss å angi en startverdi for løpenumre ved å navngi parameteren start, og for eksempel skrive start = 1.
Argumenter med parameternavn kalles keyword arguments på engelsk. Det forklarer feilmeldingen "abs() takes no keyword arguments", som vi får hvis vi skriver abs(x = -3). Argumenter uten parameternavn kalles positional arguments.
Standardverdier for parametere
Det er mulig å angi standardverdier for parametere i funksjoner. Standardverdier angis sammen med parameterne i funksjonshodet, og brukes hvis funksjonen blir kalt opp uten argumenter til parameterne. Eksempel 3 viser koden til funksjonen nrot() fra eksempel 2, med 2 satt som standardverdi for parameteren n.
Eksempel 3:
def nrot(x, n = 2):
"""Beregner n'te rot av x."""
return x**(1/n)
Hvis vi i hovedprogrammet skriver nrot(81), blir parameteren x satt til 81, og siden det ikke finnes noe argument til parameteren n, blir n satt til standardverdien 2. Med andre ord beregnes andrerot, altså kvadratrot, av 81, som er 9.
Hvis et argument koples til en parameter med standardverdi, overstyres standardverdien, og parameteren får verdien til argumentet. Har vi for eksempel funksjonen nrot() som i eksempel 3, og skriver nrot(81, 4), i hovedprogrammet, overstyrer 4 standardverdien 2, og vi får beregnet fjerderot av 81, som er 3.
Standardverdier kalles default values på engelsk.
Parametere med standardverdier må komme til høyre for alle parametere uten standardverdier. Gjør de ikke det, vil det ikke være en entydig kopling mellom argumenter og parametere. Hvis vi for eksempel bytter om på parameterne i eksempel 3, og definerer nrot() som
def nrot(n = 2, x):
return x**(1/n)
vil det ikke være mulig å avgjøre om et argument skal koples til parameteren n eller ikke. En slik definisjon vil gi feilmeldingen "SyntaxError: non-default argument follows default argument".
Har vi flere parametere med standardverdier, koples de med argumentene fra venstre mot høyre.
Eksempel 4:
Sannsynlighetstettheten i en normalfordeling er gitt ved
$f(x) = \frac{\displaystyle 1}{\displaystyle \sigma \sqrt{2\pi}} {\; \large e}^{{\large -} \, \frac{\displaystyle (x – \mu)^2}{\displaystyle 2 \sigma^2}}$
der μ er forventningsverdi og σ er standardavvik.
Så skal vi skrive en funksjon, normal(), som bruker denne formelen til å beregne f(x) basert på parameterne x, μ (my) og σ (sigma). Ofte brukes imidlertid et spesialtilfelle av normalfordelingen som kalles standard normalfordeling, der μ = 0 og σ = 1. Vi lar derfor 0 og 1 være standardverdier for henholdsvis my og sigma.
from math import pi, exp, sqrt
def normal(x, my = 0, sigma = 1):
"""Beregner sannsynlighetstettheten til x"""
eksp = -(x - my)**2 / (2 * sigma**2)
return 1/(sigma * sqrt(2 * pi)) * exp(eksp)
Vil vi for eksempel beregne sannsynlighetstettheten til 2 i en standard normalfordeling, trenger vi ikke oppgi noe argument til my eller sigma, siden vi skal bruke standardverdiene. Vi kan bare skrive normal(2).
Skriver vi normal(2, 4), blir my satt til 4, mens sigma beholder standardverdien 1.
Skriver vi normal(2, 4, 3), blir my satt til 4, og sigma blir satt til 3.
I funksjonen normal() i eksempel 4 har imidlertid parameterne my og sigma, en spesiell betydning, slik at det vil være naturlig å navngi dem. For eksempel ved å skrive normal(2, my = 4) eller normal(2, my = 4, sigma = 3). Da kan vi også gi en verdi til sigma og la my beholde standardverdien, for eksempel ved å skrive normal(2, sigma = 3).
Skriv kode som bruker funksjonen normal() i eksempel 4 til å beregne sannsynlighetstettheten til 3 i en normalfordeling der sigma er 5, men my beholder standardverdien 0.
Kilder
-
- Matthes A. (2019). Python Crash Course. no starch press