2.14. Definiowanie funkcji

Funkcja opakowuje blok kodu pod nazwą, dzięki czemu można go wywołać z wielu miejsc. Wszędzie tam, gdzie obliczenie, działanie lub określony fragment pracy pojawia się więcej niż raz, funkcja zamienia go w jedną nazwaną rzecz.

Słowem kluczowym jest def:

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

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

Wyjście:

hello, Alice
hello, Bob

Wiersz zaczynający się od def to definicja – tworzy funkcję, ale nie uruchamia jej ciała. To wywołanie greet("Alice") uruchamia wcięty blok.

2.14.1. Parametry i argumenty

Nazwy w nawiasach w wierszu def to parametry – symbole zastępcze dla wartości, które dostarczy wywołujący. Faktycznie przekazane wartości to argumenty. Funkcja może przyjmować zero lub więcej parametrów:

def square(x):
    return x * x

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

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

Wywołanie z niewłaściwą liczbą argumentów natychmiast zgłasza TypeError.

2.14.2. return

Instrukcja return natychmiast kończy funkcję i przekazuje wartość z powrotem do wywołującego:

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

Funkcja, która nigdy nie osiąga return (lub ma samo return bez wartości), zwraca None:

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

Funkcja może mieć kilka instrukcji return; wygrywa pierwsza osiągnięta, a reszta ciała jest pomijana.

2.14.2.1. Zwracanie wielu wartości

Python zwraca jeden obiekt na wywołanie, ale tym obiektem może być tuple – a wywołujący może rozpakować go na miejscu:

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

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

Nawiasy wokół zwracanej wartości są opcjonalne; return a, b i return (a, b) są tym samym.

2.14.3. Docstringi

Literał łańcuchowy umieszczony jako pierwsza instrukcja ciała funkcji to docstring. Jest przechowywany w obiekcie funkcji i jest tym, co wyświetla help():

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

IDE pokazuje docstringi w dymkach, gdy kursor najedzie na nazwę funkcji, więc nawet jednowierszowe podsumowanie się opłaca. Łańcuchy w potrójnych cudzysłowach pozwalają docstringowi obejmować wiele wierszy, gdy przydatne są większe szczegóły.

2.14.4. Konwencje nazewnictwa

Nazwy funkcji używają snake_case – małe litery oddzielone podkreśleniami. Nazwa powinna opisywać, co funkcja robi:

  • Dobre: read_temperature, parse_header, is_valid.

  • Unikaj: do_stuff, handle1, temp_func.

Wiodące podkreślenie (_helper) oznacza funkcję jako wewnętrzną dla jej modułu. Konwencja jest szeroko respektowana, ale nie jest egzekwowana przez Pythona.