Rozdział 13 · Automatyzacja z funkcjami

Brak argumentów? Za dużo argumentów!

Domyślne wartości czynią argument opcjonalnym — ale zmienna wartość domyślna skrywa jedną z najbardziej znanych pułapek Python.

Brak argumentów? Co robić!

Jeśli wywołać funkcję bez obowiązkowego argumentu, Python zgłosi błąd. Aby argument można było pominąć, nadaje mu się domyślny:

znachenie_po_umolchaniyu.py
def privetstvie(imya=„przyjaciel”):
    print(f"Cześć, {imya}!")

privetstvie()          #Hello przyjacielu!
privetstvie(„Ada”)     # Cześć, Ada!
PodpisRola
imyaobowiązkowy parametr — jeśli nie było ciszy
imya="друг"parametr opcjonalny z wartością domyślną

Pułapka zmiennej domyślnej mutowalnej

To jedna z najsłynniejszych niespodzianek Python – i trzeba ją powoli rozwiązywać.

mutable_default_trap.py
def add_task(task, tasks=[]):
    tasks.append(task)
    return tasks

print(add_task("A"))
print(add_task("B"))
['A']
['A', 'B']
Drugie wywołanie nie zaczyna od pustej listy — B dodał się do tej samej listy co A!
Domyślna lista jest tworzona RAZ – w momencie wykonania def
tasks=[] oblicza się w momencie definicje funkcje, a nie od nowa przy każdym wywołaniu. Powstaje ten sam obiekt domyślny lista, wspólny dla wszystkich wywołań, gdzie argument nie został przekazany jawnie.
PROGRAM GŁÓWNYFUNKCJA (na etapie definicji)def add_task(task,tasks=[]):tworzony jest obiekt listadomyślny []wywołanie
Domyślna lista jest tworzona raz, gdy Python sam wykonuje wiersz def
Wyzwanie 1:add_task('A')Wyzwanie 2:add_task('B')TAK SAMOlista po…
Oba wywołania bez wyraźnego tasks używają tej samej wspólnej lista

Poprawny wzór: None jako znak „nie transmitowany”

mutable_default_fix.py
def add_task(task, tasks=None):
    if tasks is None:
        tasks = []

    tasks.append(task)
    return tasks
None jest domyślnym argumentem bezpiecznego sygnału
None jest niezmiennym pojedynczym obiektem, więc można go bezpiecznie używać jako domyślnego. Walidacja if tasks is None (Rozdział 9: is None) tworzy NOWY pusty lista przy każdym wywołaniu bez argumentu — dokładnie to zachowanie, którego intuicyjnie oczekiwano. To nie jest jedyny sposób rozwiązania problemu, ale najczęściej spotykany.

Za dużo kłótni!

Czasem nie wiadomo, ile argumentów trzeba przegłosować z wyprzedzeniem. Symbol * przed nazwą parametru zbiera żadnych liczba argumentów w jednej krotki (Rozdział 11):

args.py
def summa_vseh(*chisla):
    itog = 0
    for n in chisla:
        itog += n
    return itog

print(summa_vseh(1, 2))           # 3
print(summa_vseh(1, 2, 3, 4, 5))  #15 – Tyle argumentów, ile chcesz
Argumenty nazwane – przypomnienie
Argumenty można przekazywać również po nazwie, a nie tylko po kolejności: privetstvie(imya="Ада") – więcej na ten temat w §13.6.
Praktyka: Domyślne i Pułapka Domyślna Zmienna
interaktywny laptop bezpośrednio w przeglądarce – Python 3.14 przez Pyodide, bez instalacji
Otwórz praktykę →