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!
| Podpis | Rola |
|---|---|
imya | obowią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']
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.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