Przejdź do treści

Zadanie z gwiazdką, czyli rzecz o args i *kwargs

Często spotykamy się z funkcjami, które wśród argumentów zawierają \"magiczne\" wyrażenia *args i **kwargs. Jednak początkujący programiści Pythona miewają problemy ze zrozumieniem działania tego mechanizmu.

Zacznijmy od odpowiedzenia sobie na pytanie czym są te "argsy i kwargsy" i czemu poprzedzają je gwiazdki.
Wyrażenie args bierze się od słowa arguments czyli argumenty i jest to zazwyczaj zmienna, która zawiera tuple argumentów pozycyjnych.
Natomiast kwargs bierze się od keyword arguments czyli argumenty nazwane i zmienna taka zawiera pary nazwa-wartość argumentu.

Jednak należy zaznaczyć, że nazwy te nie są wcale najważniejsze. Największa magia kryje się w gwiazdkach je poprzedzających, a args i kwargs możemy zastąpić dowolnymi innymi nazwami zmiennych.


Umieszczając w definicji funkcji wyrażenie z jedną lub dwoma gwiazdkami pozwalamy na przekazywanie do niej argumentów w dowolnej liczbie i nazwie.
Bez konieczności konkretnego określenia tych parametrów. Jest to przydatne w momencie gdy chcemy, aby nasza funkcja była nieco bardziej uniwersalna.

Po pierwsze: *args

Wyrażenia z jedną gwiazdką (*) używamy gdy do funkcji chcemy przekazać dowolną liczbę argumentów pozycyjnych.
Czyli takich dla których przy wywołaniu funkcji nie podajemy ich nazwy, a przypisanie wartości bazuje na kolejności argumentów.
Z tego powodu parametr *args umieszczamy na końcu listy parametrów w definicji funkcji.

def parametr_args(argument, *args):
    print("zawartość args: {}".format(args))
    print("argument nazwany: {}".format(argument))
    for arg in args:
        print("argument z *args: {}".format(arg))

parametr_args('python', 'spam', 'eggs', 'test')

Możesz zauważyć, że wywołując powyższą funkcję przekazaliśmy w jej wywołaniu więcej argumentów niż zadeklarowaliśmy. Nadmiarowe argumenty zostały umieszczone w tupli po której z łatwością możemy iterować, aby dostać się do tych argumentów.

Po drugie: **kwargs

W przypadku gdy do naszej funkcji chcemy przekazywać argumenty, które wyróżniają się nazwą możemy użyć parametru z dwoma gwiazdkami (**). Przekazane w ten sposób argumenty są dostępne w funkcji w postaci słownika. Jego pary klucz-wartość stanowią nazwę i wartość przekazanego argumentu.

def parametr_kwargs(argument, **kwargs): 
    print("argument: {}".format(argument))
    print("zawartość kwargs: {}".format(kwargs))

parametr_kwargs(dodatkowy=48, nastepny=111, argument=12) 

# argument: 12 
# zawartość kwargs: {'dodatkowy': 48, 'nastepny': 111}

Jak widzisz w powyższym przykładzie argumenty, które nie zostały zdefiniowane w funkcji trafiły do słownika o nazwie kwargs.

Jak używać gwiazdek w *args i **kwargs?

Możesz również używać obu poznanych przed chwilą parametrów. W tym przypadku pamiętaj jedynie o kolejności – wyrażenie z dwoma gwiazdkami musi być na końcu, z jedną gwiazdką wcześniej, a pozostałe zdefiniowane argumenty na początku.

Gwiazdek możesz również używać w wywołaniu funkcji. Jest to tak zwane rozpakowywanie list i słowników z argumentami. Jeżeli funkcja przyjmuje kilka argumentów i posiadasz listę, która zawiera argumenty, które chcesz przekazać do tej funkcji wystarczy poprzedzić nazwę listy gwiazdką zamiast podawać kolejne argumenty ręcznie.

lista_argumentow = [1, 3, 5] 

def rozpakowywanie(pierwszy, drugi, trzeci):
    print(pierwszy)
    print(drugi)
    print(trzeci) 

rozpakowywanie(*lista_argumentow) 

# 1 
# 3 
# 5

Przyznasz, że ten sposób wygląda dużo lepiej niż:

rozpakowywanie(lista_argumentow[0], lista_argumentow[1], lista_argumentow[2])

Mam nadzieję, że ten artykuł rozjaśnił Ci działanie gwiazdek w Pythonie. Jeżeli masz jeszcze jakieś pytanie dotyczące działania tego mechanizmu zapraszam do zostawienia komentarza.

Jeżeli dopiero zaczynasz swoją przygodę z Pythonem lub jesteś bardziej zaawansowany sprawdź jak może pomóc Ci Jupyter Notebook.


A może potrzebujesz pomocy w nauce programowania i nie wiesz do kogo zwrócić się z pytaniami? Zajrzyj na stronę O Blogu – znajdziesz tam więcej szczegółów na temat prowadzonego przeze mnie mentoringu.

Spodobał Ci się ten artykuł? Sprawdź też pozostałe wpisy na moim blogu!