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?

  1. Definicja naszej funkcji, zawiera zmienną, której nazwa rozpoczyna się od *
  2. Jest to informacja, że parametry przekazane do funkcji, należy ‚spakować’, do zmiennej typu krotka. Czyli forma podobna do listy, lecz niemodyfikowalna.
  3. 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
  4. 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?

  1. 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.
  2. W prosty sposób, sprawdzamy ilość parametrów – len(kwargs)
  3. 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

  1. Wstęp do kursu
  2. Moduły i pakiety
  3. Programowanie obiektowe – wstęp
  4. Programowanie obiektowe – dziedziczenie
  5. Programowanie obiektowe – hermetyzacja
  6. Mini projekt – Organizer
  7. Funkcje rekurencyjne w Python
  8. Pisanie skryptów w Python
  9. Mini projekt – tajny agent, generator haseł
  10. *args oraz **kwargs <– bieżąca lekcja
  11. Dekoratory w Python
  12. Mini projekt – tajny agent – kontakty
  13. Odwzorowanie list
  14. Podsumowanie oraz dalsze kroki