Funkcja to nazwany blok kroków
Za każdym razem, gdy piszesz te same kilka linii więcej niż raz albo chcesz nadać nazwę małemu kawałkowi logiki, to znak, że czas napisać funkcję. Funkcje to pierwsze prawdziwe narzędzie do panowania nad złożonością programu w Pythonie.
Podstawowy kształt:
Po kolei:
defto słowo kluczowe, które rozpoczyna definicję funkcji.greetto nazwa funkcji.(name)to lista parametrów, czyli danych wejściowych, które przyjmuje funkcja.- Dwukropek kończy nagłówek, a wcięty blok poniżej to ciało.
greet("Ada")to wywołanie. Python wykonuje ciało znamepowiązanym z"Ada".
Funkcje czekają uśpione, dopóki ich nie wywołasz. Zdefiniowanie funkcji jej nie uruchamia. Robi to dopiero wywołanie greet("Ada").
Parametry i argumenty
Parametr to nazwa w definicji funkcji. Argument to wartość przekazywana przy wywołaniu. W luźnej rozmowie to nic wielkiego, ale to rozróżnienie pomaga przy czytaniu komunikatów o błędach.
Tutaj base i exponent to parametry. 2 i 10 to argumenty. Python wiąże je po kolei: pierwszy argument z pierwszym parametrem i tak dalej.
return: odesłanie wartości
print wypisuje na ekran. return przekazuje wartość wywołującemu, żeby mógł jej użyć:
Bez return funkcja domyślnie zwraca None:
return natychmiast kończy też funkcję. Często zobaczysz wczesne powroty, które obsługują przypadki brzegowe przed główną logiką:
Wczesne powroty chronią główne ciało przed głębokim zagnieżdżaniem w if/else.
Argumenty domyślne
Parametr może mieć wartość domyślną, używaną wtedy, gdy wywołujący jej nie poda:
Wszystkie parametry z wartościami domyślnymi muszą występować po parametrach bez nich. def f(a, b=1, c): to błąd składni.
Pułapka modyfikowalnej wartości domyślnej
To najsłynniejsza pułapka Pythona. Patrz:
Można by się spodziewać, że każde wywołanie zaczyna z pustą listą. Zamiast tego domyślna lista jest wspólna dla wszystkich wywołań, a elementy się kumulują. Python oblicza wartość domyślną raz, w chwili definiowania funkcji, i używa tej jednej listy już na zawsze.
Bezpieczny wzorzec to użycie None jako wartości domyślnej i utworzenie listy wewnątrz funkcji:
Teraz każde wywołanie, które nie przekazuje items, dostaje nową listę. Ta zasada dotyczy list, słowników, zbiorów, czyli wszystkiego, co modyfikowalne.
Argumenty nazwane
Argumenty możesz przekazywać po nazwie zamiast po pozycji. Pozwala to pominąć parametry ze środka i sprawia, że długie wywołania są czytelniejsze:
Argumenty pozycyjne i nazwane można mieszać, ale pozycyjne muszą być pierwsze:
Gdy funkcja ma więcej niż trzy czy cztery parametry, stawianie na argumenty nazwane bardzo ułatwia czytanie wywołań.
Parametry tylko pozycyjne i tylko nazwane
Python pozwala oznaczyć niektóre parametry jako przekazywane tylko przez pozycję (przez /) albo tylko przez nazwę (przez *):
Nie potrzebujesz tego pierwszego dnia. Przydaje się to przy projektowaniu API, gdy chcesz ściśle określić, jak wywołujący mają używać twojej funkcji.
Docstringi i nazewnictwo
Pierwszą linią w funkcji może być docstring, czyli napis w potrójnych cudzysłowach, który Python traktuje jako dokumentację:
Narzędzia takie jak help(), podpowiedzi w IDE i generatory dokumentacji automatycznie czytają docstring. Jedna linia jest dużo lepsza niż nic.
I proszę, przemyśl nazwy:
- Nazwy funkcji powinny być czasownikami:
fetch_profile,compute_total,is_valid. - Używaj
lower_snake_case. - Funkcje zwracające wartość logiczną często zaczynają się od
is_,has_albocan_.
Dobra nazwa sprawia, że miejsce wywołania objaśnia się samo, bez komentarza.
Funkcje czyste łatwiej zrozumieć
Funkcja czysta zwraca ten sam wynik dla tych samych danych wejściowych i nie ma efektów ubocznych: nie zmienia stanu globalnego, nie wypisuje na stdout (poza debugowaniem) i nie zapisuje do plików.
Obie mają swoje miejsce, ale w kodzie, który chcesz ponownie wykorzystywać i testować, dąż do funkcji czystych, na ile się da.
Mały działający przykład
Krótka funkcja, która łączy wartości domyślne, argumenty nazwane i return:
Dalej: elastyczne listy argumentów
Czasem nie wiesz, z iloma argumentami funkcja zostanie wywołana, albo chcesz przekazać dowolne otrzymane argumenty do innej funkcji. Do tego służą *args i **kwargs. O nich jest następna strona.
Najczęściej zadawane pytania
Jak zdefiniować funkcję w Pythonie?
Użyj słowa kluczowego def, a po nim nazwy funkcji, nawiasów z parametrami i dwukropka. Wcięty blok poniżej to ciało funkcji. Przykład: def greet(name): print(f'Hi, {name}').
Co robi return w Pythonie?
return odsyła wartość do tego, kto wywołał funkcję. Funkcja bez jawnego return automatycznie zwraca None. Gdy tylko wykona się return, funkcja natychmiast się kończy, a kod po nim w tym samym bloku jest pomijany.
Czym są argumenty domyślne w Pythonie?
Argumenty domyślne pozwalają parametrowi mieć z góry ustaloną wartość, używaną wtedy, gdy wywołujący jej nie poda. def greet(name='friend'): oznacza, że greet() bez argumentów użyje 'friend'. Nigdy nie używaj modyfikowalnych wartości domyślnych, takich jak []: bezpieczny wzorzec opisano poniżej.