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)
numbers(1, 2, 3, 4)
Funkcja wewnętrzna numbers jest krotką regularną (Rozdział 11)
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",
)
fields{"name": "Anna","city":…
Funkcja wewnętrzna fields jest regularnym słownik (Rozdział 11)
** 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
Zbieraniepotrzebne argumenty pozycyjnedodatkowe argumenty nazwane
Wpis w funkcjitupledict
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)
(10, 20)kondukt*rozpakowywaniemove(10, 20)dwa argumenty
* przed argumentem, gdy wywołany, rozkłada krotkę/lista na oddzielne argumenty pozycyjne
raspakovka_slovarya.py
options = {
    "color": "red",
    "size": 3,
}
draw(**options)   # odpowiada draw(color=„red”

* i ** występują w kilku różnych kontekstach

KontekstPrzykładCo robi
Definicja funkcjidef f(*args, **kwargs):zbiera niepotrzebne argumenty
Wywołanie funkcjif(*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
Otwórz praktykę →