Jak się okazuje, funkcje w Python, mogą przyjmować zmienną liczbę parametrów. Jednak, aby to umożliwić, musimy posłużyć się mechanizmami, o których jeszcze nie rozmawialiśmy, a będzie to bardzo użyteczne na dalszych etapach nauki. Mianowicie * oraz **. Zaczynajmy!
Do tej pory, nasza definicja funkcji w Python, zakładała, stałą liczbę parametrów. Mogły to być liczby, tekst, listy, ale zawsze ich ilość była stała, tak jak poniżej:
def funk(a,b,c): pass
Z czasem, pojawia się konieczność, przygotowania naszej funkcji na przyjęcie zmiennej liczby parametrów. Tutaj, z pomocą przychodzi nam pojedyncza * i podwójna **.
Przykład 1 – *args:
def funk(*args): print(args) funk(1,2,3) funk(1,2,3,4)
A w rezultacie otrzymamy:
Co się dzieje?
- Definicja naszej funkcji, zawiera zmienną, której nazwa rozpoczyna się od *
- Jest to informacja, że parametry przekazane do funkcji, należy 'spakować’, do zmiennej typu krotka. Czyli forma podobna do listy, lecz niemodyfikowalna.
- Tym samym, niezależnie, z jaką ilością parametrów, wywołamy funkcję, czy 0 czy 100, wszystkie zostaną umieszczone w krotce. W tym przypadku, jest to nazwa args
- Nazwa args, jest standardową nazwą w tym przypadku, jednak, może to być dowolna, inna nazwa zmiennej, jak np. *a.
Przykład 2 – *args:
def funk(*args): print("Liczba przekazanych parametrów:",len(args)) for arg in args: print ("Wartość:",arg) lista = [1,3,5,6] funk(1,lista,2,'xyz',3)
Co w rezultacie, da nam:
Jest to bardzo wygodny sposób na pracę z niewiadomą liczbę parametrów, które mamy dostępne w zmiennej typu krotka. Ich liczbę, możemy łatwo sprawdzić za pomocą 'len(args)’.
Język Python, daje nam jeszcze jedną, ciekawą możliwość. Mianowicie, możemy przekazywać do funkcji, zmienne typy klucz:wartość.
Przykładowo, mogli byśmy wywołać funkcję,w następujący sposób: funk(a=1,b=2,c=3). Jednak, dostaniemy błąd. Z tego względu, że zmienne typu *, jak w naszym przypadku *args, nie obsługują parametrów typu klucz:wartość. Natomiast zmianne typu **, już tak. spójrzmy na kolejny przykład:
Przykład 3 – **kwargs:
def funk(**kwargs): print("Liczba przekazanych parametrów:",len(kwargs)) for key, item in kwargs.items(): print ("Klucz:", key, "Wartość:", item) funk(a=1,b=2,c=3)
co, w rezultacie, daje nam:
Co się dzieje?
- Zdefiniowaliśmy funkcję z parametrem **. Jest to informacja dla Python, że przekazywane parametry, są typy klucz:wartość, i należy je 'spakować’, oraz umieścić w zmiennej typu słownik.
- W prosty sposób, sprawdzamy ilość parametrów – len(kwargs)
- W typowy, dla słowników sposób, pobieramy klucz oraz wartość
Tak jak widzimy, jest to bardzo podobny mechanizm, do pojedynczej *, jednak umożliwiający nam przekazywanie do funkcji kluczy i ich wartości.
Zarówno * jak i ** , możemy wykorzystać w tej samej definicji funkcji:
Przykład 4 – *args oraz **kwargs:
def funk(*args, **kwargs): print("Liczba przekazanych parametrów *args:",len(args)) for arg in args: print ("Args - Wartość:", arg) print("Liczba przekazanych parametrów **kwargs:",len(kwargs)) for key, item in kwargs.items(): print ("Kwargs - ", "Klucz:", key, "Wartość:", item) funk(11,22,['x','y','z'],a=1,b=2,c=3)
W naszym przypadku, wszystkie zmienne, które, są inne niż klucz:wartość, zostały 'spakowane’ do krotki – *args, natomiast zmienne postaci klucz:wartość do zmiennej typu słownik.
Ważna jest kolejność podawania parametrów. Parametry typu klucz:wartość, podajemy na końcu wywołania funkcji.
Podsumowując. W ten oto sposób, jesteśmy gotowi, aby obsłużyć dowolna liczbę parametrów, dowolnego typu. *, pozwala na przyjęcie parametrów innych niż klucz:wartość, a **, na klucz:wartość. Będziemy z tego korzystać, dość często. Zanim przejdziemy, do następnej lekcji, zapraszamy do wykonania, krótkich ćwiczeń na dole artykułu.
W następnej lekcji, opanujemy tematykę dekoratorów, aby pewnym krokiem zmierzać w kierunku kolejnego mini-projektu. Zapraszamy.
Ćwiczenia
Ćwiczenie 1: Należy, przygotować funkcję, sumującą, wszystkie zmienne, podane jako parametry funkcji. Przykładowo:
funk(1,2,3,4), zwróci, wartość 10
Ćwiczenie 2: Należy, przygotować funkcję, która zawsze przyjmuje co najmniej jeden parametr – nazwisko, natomiast jako parametr, imię oraz wiek, znanych osób z rodziny. Np
funk(’Kowalscy’,Ewa=33, Michał=44)
Rozwiązanie 1:
def funk(*args): suma = 0 for arg in args: suma += arg return suma print ( funk(1,2,3,4) )
Rozwiązanie 2:
def funk(nazwisko, **kwargs): print("Nazwisko:", nazwisko) for key, item in kwargs.items(): print("Imię:",key,"Wiek:", item) funk ("Kowalscy",Ewa=33, Michał=44)
Python, NIE tylko dla początkujących
- Wstęp do kursu
- Moduły i pakiety
- Programowanie obiektowe – wstęp
- Programowanie obiektowe – dziedziczenie
- Programowanie obiektowe – hermetyzacja
- Mini projekt – Organizer
- Funkcje rekurencyjne w Python
- Pisanie skryptów w Python
- Mini projekt – tajny agent, generator haseł
- *args oraz **kwargs <– bieżąca lekcja
- Dekoratory w Python
- Mini projekt – tajny agent – kontakty
- Odwzorowanie list
- Podsumowanie oraz dalsze kroki