Przejdź do głównej treści
eLearner.app
Moduł 5 · Lekcja 3 z 419/36 w kursie~12 min
Lekcje modułu (3/4)

*args i **kwargs

Czasami chcesz, aby funkcja akceptowała zmienną liczbę argumentów. Python udostępnia dwa narzędzia: *args (zbiera argumenty pozycyjne w krotkę) i **kwargs (zbiera argumenty słownikowe w słownik).

*args: zmienne argumenty pozycyjne

Python
def somma_tutto(*nums):
    totale = 0
    for n in nums:
        totale += n
    return totale

somma_tutto(1, 2, 3)         # 6
somma_tutto(1, 2, 3, 4, 5)   # 15
somma_tutto()                # 0

Wewnątrz funkcji, nums jest krotką ze wszystkimi przekazanymi wartościami. Nazwa to tylko konwencja: *args jest najczęstsza, ale *nums lub *valori są w pełni poprawne.

**kwargs: zmienne argumenty słownikowe

Python
def crea_config(**opzioni):
    return opzioni

crea_config(debug=True, port=8080)
# {'debug': True, 'port': 8080}

Wewnątrz funkcji, opzioni jest słownikiem w formacie {param_name: value}.

Łączenie wszystkiego

Ustalona kolejność to: **zwykłe parametry, *args, parametry domyślne, **kwargs**.

Python
def f(primo, *args, opzione="x", **kwargs):
    print(primo, args, opzione, kwargs)

f(1, 2, 3, opzione="y", extra=10)
# 1 (2, 3) y {'extra': 10}

Rozpakowywanie w wywołaniu: * i **

Ten sam operator działa w drugą stronę: aby "rozbić" listę/krotkę na argumenty pozycyjne lub słownik na argumenty o nazwie.

Python
def punto(x, y, z):
    return (x, y, z)

coords = [1, 2, 3]
punto(*coords)        # punto(1, 2, 3)  →  (1, 2, 3)

opts = {"x": 1, "y": 2, "z": 3}
punto(**opts)         # punto(x=1, y=2, z=3)

Wzorzec wrappera

Python
def log_chiamata(fn, *args, **kwargs):
    print(f"chiamo {fn.__name__} con {args=} {kwargs=}")
    return fn(*args, **kwargs)

log_chiamata(max, 3, 1, 2)             # calls max(3, 1, 2)
log_chiamata(sorted, [3, 1, 2], reverse=True)

Kolejność parametrów w sygnaturach funkcji

Definiując funkcję, która akceptuje wiele typów argumentów, należy przestrzegać ścisłej kolejności w sygnaturze:

  1. Standardowe parametry pozycyjne.
  2. Pozycyjne varargs *args.
  3. Parametry kluczowe z wartościami domyślnymi.
  4. Kluczowe varargs **kwargs.

Spróbuj sam

Ćwiczenie#python.m5.l3.e1
Próby: 0Ładowanie...

Zdefiniuj funkcję `average(*nums)` która zwraca średnią arytmetyczną (suma / liczba elementów). Wywołaj ją z wartościami 10, 20, 30 i przypisz wynik do zmiennej `m`. Oceń `m`.

Ładowanie edytora...
Pokaż wskazówkę

sum(nums) / len(nums)

Rozwiązanie dostępne po 3 próbach

Ćwiczenie powtórzeniowe

Ćwiczenie#python.m5.l3.e2
Próby: 0Ładowanie...

Mając daną funkcję `def point(x, y, z): return x + y + z` oraz słownik `coords = {'x': 1, 'y': 2, 'z': 3}`, wywołaj point rozpakowując coords i przypisz wynik do zmiennej `s`. Oceń `s`.

Ładowanie edytora...
Pokaż wskazówkę

point(**coords)

Rozwiązanie dostępne po 3 próbach

Dodatkowe wyzwanie

Ćwiczenie#python.m5.l3.e3
Próby: 0Ładowanie...

Napisz funkcję `multiply_all(*args)` która zwraca iloczyn wszystkich liczb przekazanych jako argumenty. Jeśli nie zostaną przekazane żadne argumenty, powinna zwrócić `1`. Na koniec oceń wywołanie `multiply_all(2, 3, 4)`.

Ładowanie edytora...
Pokaż wskazówkę

Użyj pętli for do iteracji po elementach w args i akumulacji ich iloczynu.

Rozwiązanie dostępne po 3 próbach