2.14. Funktioiden määrittely

Funktio paketoi koodilohkon nimen alle, jotta sitä voidaan kutsua monesta paikasta. Aina kun laskelma, toiminto tai jäsennelty työnpätkä esiintyy useammin kuin kerran, funktio tekee siitä yhden nimetyn asian.

Avainsana on def:

def greet(name):
    print("hello,", name)

greet("Alice")
greet("Bob")

Tuloste:

hello, Alice
hello, Bob

def-sanalla alkava rivi on määrittely – se luo funktion mutta ei suorita runkoa. greet("Alice")-kutsu suorittaa sisennetyn lohkon.

2.14.1. Parametrit ja argumentit

def-rivin sulkeissa olevat nimet ovat parametreja – paikanvaraajia arvoille, jotka kutsuja antaa. Sisään välitetyt todelliset arvot ovat argumentteja. Funktio voi ottaa nolla tai useampia parametreja:

def square(x):
    return x * x

def add(a, b):
    return a + b

def is_even(n):
    return n % 2 == 0

Väärällä argumenttimäärällä tehty kutsu nostaa TypeError-poikkeuksen heti.

2.14.2. return

return-lause päättää funktion välittömästi ja antaa arvon takaisin kutsujalle:

def absolute(x):
    if x < 0:
        return -x
    return x

Funktio, joka ei koskaan saavuta return-lausetta (tai jolla on paljas return ilman arvoa), palauttaa None:

>>> def shout(text):
...     print(text.upper())
...
>>> result = shout("hi")
HI
>>> print(result)
None

Funktiolla voi olla useita return-lauseita; ensimmäinen saavutettu voittaa, ja loput rungosta ohitetaan.

2.14.2.1. Useiden arvojen palauttaminen

Python palauttaa yhden objektin kutsua kohti, mutta tuo objekti voi olla tuple – ja kutsuja voi purkaa sen heti:

def minmax(values):
    return (min(values), max(values))

lo, hi = minmax([3, 1, 4, 1, 5, 9])

Palautusarvoa ympäröivät sulkeet ovat valinnaiset; return a, b ja return (a, b) ovat sama asia.

2.14.3. Dokumenttimerkkijonot

Funktion rungon ensimmäiseksi lauseeksi sijoitettu merkkijonoliteraali on dokumenttimerkkijono. Se tallennetaan funktio-objektiin, ja sen help() näyttää:

def scale(value, factor):
    """Multiply ``value`` by ``factor`` and return the result."""
    return value * factor

IDE näyttää dokumenttimerkkijonot työkaluvihjeissä, kun kohdistin viedään funktion nimen päälle, joten jopa yhden rivin tiivistelmä maksaa itsensä takaisin. Kolmoislainausmerkein varustetut merkkijonot sallivat dokumenttimerkkijonon ulottua usealle riville, kun yksityiskohdista on hyötyä.

2.14.4. Nimeämiskäytännöt

Funktionimet käyttävät snake_case-muotoa – pienaakkossanoja, jotka on erotettu alaviivoilla. Nimen tulisi kuvata, mitä funktio tekee:

  • Hyvä: read_temperature, parse_header, is_valid.

  • Vältä: do_stuff, handle1, temp_func.

Alkuun sijoitettu alaviiva (_helper) merkitsee funktion moduulinsa sisäiseksi. Käytäntöä kunnioitetaan laajalti, mutta Python ei pakota sitä.