Jak używać *args i **kwargs w funkcjach Pythona

Opanuj *args i **kwargs w Pythonie. Dowiedz się, jak pisać elastyczne funkcje z dynamicznymi argumentami pozycyjnymi i kluczowymi, rozpakowywać kolekcje i budować funkcje opakowujące.

Wypróbuj to rozwiązanie w Edytorze

Przegląd

W Pythonie często będziesz musiał projektować funkcje, które akceptują zmienną liczbę argumentów. Na przykład funkcja obliczająca sumę dowolnej liczby liczb całkowitych lub funkcja rejestrująca metadane z różnymi polami. Zamiast zmuszać użytkowników do przekazania listy lub słownika, Python udostępnia dwa specjalne symbole: `*args` i `**kwargs`.

Składnia `*args` pozwala funkcji przyjmować dowolną liczbę argumentów pozycyjnych. Pojedyncza gwiazdka `*` pełni rolę operatora rozpakowywania. Umieszczona w definicji funkcji zbiera dodatkowe argumenty pozycyjne w krotce o nazwie „args”. Dzięki temu możesz z łatwością iterować po wartościach wejściowych, uruchamiać obliczenia lub przekazywać je do innej funkcji.

Z drugiej strony składnia `**kwargs` pozwala funkcji przyjąć dowolną liczbę argumentów słów kluczowych (nazwanych). Podwójna gwiazdka `**` zbiera te argumenty w słowniku o nazwie `kwargs`. Jest to niezwykle przydatne do przekazywania opcjonalnych konfiguracji, argumentów stylizujących lub atrybutów bazy danych. Pamiętaj, że nazwy „args” i „kwargs” są konwencjami; rzeczywista funkcjonalność jest oznaczona pojedynczymi i podwójnymi gwiazdkami.

Dane wyjściowe kodu i wykonania

Ten kod demonstruje użycie *args do sumowania liczb zmiennych, **kwargs do drukowania profili użytkowników i połączenie obu w jedną funkcję.

args_kwargs.py
Spróbuj w Edytorze
def sum_all(*args):
    print("args type:", type(args).__name__)
    return sum(args)

print("Sum (1, 2, 3):", sum_all(1, 2, 3))
print("Sum (10, 20):", sum_all(10, 20))

def print_profile(**kwargs):
    print("kwargs type:", type(kwargs).__name__)
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_profile(name="Bob", role="developer", country="US")

def master_function(first, *args, **kwargs):
    print(f"First argument: {first}")
    print(f"Additional positional args: {args}")
    print(f"Keyword args: {kwargs}")

master_function("hello", 1, 2, 3, debug=True, user_id=42)
Wyjście terminala
args type: tuple
Sum (1, 2, 3): 6
args type: tuple
Sum (10, 20): 30
kwargs type: dict
name: Bob
role: developer
country: US
First argument: hello
Additional positional args: (1, 2, 3)
Keyword args: {'debug': True, 'user_id': 42}

Wdrażanie krok po kroku

  • Użyj pojedynczej gwiazdki przed parametrem (np. *args), aby zebrać argumenty pozycyjne w krotkę.
  • Użyj podwójnej gwiazdki przed parametrem (np. **kwargs), aby zebrać argumenty słów kluczowych do słownika.
  • Zachowaj prawidłową kolejność parametrów: parametry standardowe, *args, parametry zawierające tylko słowa kluczowe, a następnie **kwargs.
  • Używaj składni rozpakowywania podczas wywoływania funkcji, przekazując *iterowalny lub **słownik.

Często zadawane pytania

Czy muszę używać nazw „args” i „kwargs”?

Nie, to są standardowe konwencje społeczne. Składniowo wymagane są jedynie przedrostki * i **. Można pisać *wartości i **opcje, ale ze względu na czytelność zdecydowanie zaleca się trzymanie się *args i **kwargs.

Jaka jest prawidłowa kolejność przy definiowaniu funkcji?

Prawidłowa kolejność argumentów w sygnaturze funkcji to: argumenty pozycyjne, *args, argumenty zawierające tylko słowa kluczowe i na koniec **kwargs.

Powiązane tematy

Polecane zasoby Pythona

Poszerzaj swoją wiedzę dzięki powiązanym interaktywnym samouczkom, ściągawkom i porównaniom kodów.