Rozdział 13 · Automatyzacja z funkcjami
*args, **kwargs i rozpakowywanie
*args zbiera argumenty pozycyjne do krotki, **kwargs — argumentów dodatkowych nazw w słownik. Te same postacie w momencie rozmowy rozkładają zbiór z powrotem na argumenty.
*args to dowolna liczba argumentów pozycyjnych
args_povtorenie.py
def total(*numbers):
return sum(numbers)
total(1, 2, 3, 4)
args to po prostu popularne imię
To symbol działa
* przed parametrem jest nazwa args jedynie powszechnie przyjęta konwencja. def total(*numbers) działa dokładnie tak samo jak def total(*args).**kwargs to dowolna liczba nazwanych argumentów
kwargs.py
def show_profile(**fields):
for key, value in fields.items():
print(f"{key}: {value}")
show_profile(
name="Anna",
city="Warsaw",
)
** zbiera dodatkowe nazwane argumenty w słownik
Wszystkie argumenty nazwane, dla których nie ma osobnego parametru, trafiają do słownik
fields — klucz - nazwa argumentu, wartość - przekazana wartość.*args vs **kwargs
vyzov_s_oboimi.py
func(10, 20, color="red", size=3)
| *args | **kwargs | |
|---|---|---|
| Zbiera | niepotrzebne argumenty pozycyjne | dodatkowe argumenty nazwane |
| Wpis w funkcji | tuple | dict |
| W powyższym przykładzie | (10, 20) | {'color': 'red', 'size': 3} |
Rozpakowywanie argumentów w miejscu wywołania
Ten sam symbol */**, ale teraz po stronie WYWOŁANIA, a nie definicji — łączymy z rozpakowaniem z rozdziału 11:
raspakovka_pri_vyzove.py
point = (10, 20)
move(*point) # jest równoważne move(10, 20)
raspakovka_slovarya.py
options = {
"color": "red",
"size": 3,
}
draw(**options) # odpowiada draw(color=„red”
* i ** występują w kilku różnych kontekstach
| Kontekst | Przykład | Co robi |
|---|---|---|
| Definicja funkcji | def f(*args, **kwargs): | zbiera niepotrzebne argumenty |
| Wywołanie funkcji | f(*values, **mapping) | rozkłada zbiór na argumenty |
| Kolekcja Dosłowna (Rozdział 11) | [*a, *b] | łączy kolekcje |
Jeden znak, różne znaczenie w zależności od kontekstu
* oraz ** nie oznacza dosłownie tej samej operacji wszędzie — ich rola zależy od tego, czy są w definicji funkcji, w wywołaniu czy w kolekcji dosłownie.Praktyka: *args, **kwargs i rozpakowywanie na wezwanie
interaktywny laptop bezpośrednio w przeglądarce – Python 3.14 przez Pyodide, bez instalacji