Wprowadzenie.
W poniższym wpisie przedstawiam w jaki sposób jedna funkcja możemy pobierać zmienną liczbę argumentów.
Zakres artykułu.
- Funkcja o zmiennej liczbie argumentów
- Testy
Funkcja o zmiennej liczbie argumentów
W pierwszej kolejności napiszmy funkcję, która będzie przyjmowała jeden argument pozycyjny oraz jeden argument kluczowy. Taka funkcja na przykład może wyglądać następująco.
def fun1(par1, par2=0): print(par1) print(par2)
W tym jednak przypadku nasza funkcja może przyjąć maksymalnie 2 argumenty. Co jeśli będziemy chcieli napisać taką funkcję, która będzie przyjmowała nieokreśloną liczbę argumentów?
Pierwszym sposobem stworzenia takiej funkcji, jest zadeklarowanie parametru z gwiazdką. W ten oto sposób będziemy w stanie podać wiele argumentów do funkcji. Poniżej przedstawiam zmodyfikowany przykład pierwszej funkcji, gdzie trzeci parametr jest z gwiazdką.
def fun2(par1, par2=0, *par3): print(par1) print(par2) print(par3)
W ten oto sposób od trzeciej pozycji, wszystkie argumenty zostaną przypisane do parametru par3 w postaci krotki (Tuple), przez co dalsze reguły odwoływania się do przesłanych wartości są takie same jak w typie danych krotka.
Drugim sposobem stworzenia funkcji, która przyjmuje nieokreśloną liczbę parametrów jest zadeklarowanie parametru z dwiema gwiazdkami. Różnica między pierwszym a drugim podejściem jest taka, że teraz podajemy wartości w postaci klucz – wartość.
def fun3(par1, par2=0, **par3): print(par1) print(par2) print(par3)
W ten oto sposób od trzeciej pozycji, wszystkie argumenty zostaną przypisane do parametru par3 w postaci słownika (dictionary). Podając kolejne argumenty od pozycji 3, musimy pamiętać, aby podać najpierw klucz a następnie przypisać mu wartość. Ważną różnicą jest sposób odwoływania się do konkretnych argumentów, ponieważ w tym przypadku musimy skorzystać z konstrukcji par3.get(“nazwa_klucza”).
Tworząc funkcję możemy obydwie metody mieszać, tak jak przedstawiłem to na poniższym przykładzie. Do samodzielnego przećwiczenia i przetestowania proponuję pozmieniać pozycje parametrów i sprawdzić, kiedy jaka konstrukcja jest prawidłowa a kiedy nie.
def fun4(par1, par2=0, *par3, **par4): print(par1) print(par2) print(par3) print(par4)
Przykładowy program, który pozwoli nam przetestować powyższe funkcje może wyglądać następująco.
print("START") print("Funcja 1:") fun1("tekst1", 4) print("Funcja 2:") fun2("tekst1", 4, 4, 3, "tekst2") print("Funcja 3:") fun3("tekst1", 4, arg1=2.3, arg2="tekst3") print("Funcja 4:") fun4("tekst1", 4, 4, 3, "tekst2", arg1=2.3, arg2="tekst3") print("END")
Na koniec zamieszczę, jeszcze kompletny program
def fun1(par1, par2=0): print(par1) print(par2) def fun2(par1, par2=0, *par3): print(par1) print(par2) print(par3) def fun3(par1, par2=0, **par3): print(par1) print(par2) print(par3) def fun4(par1, par2=0, *par3, **par4): print(par1) print(par2) print(par3) print(par4) print("START") print("Funcja 1:") fun1("tekst1", 4) print("Funcja 2:") fun2("tekst1", 4, 4, 3, "tekst2") print("Funcja 3:") fun3("tekst1", 4, arg1=2.3, arg2="tekst3") print("Funcja 4:") fun4("tekst1", 4, 4, 3, "tekst2", arg1=2.3, arg2="tekst3") print("END")
Testy
Po uruchomieniu programu w konsoli powinniśmy otrzymać następujący efekt.
START Funcja 1: tekst1 4 Funcja 2: tekst1 4 (4, 3, 'tekst2') Funcja 3: tekst1 4 {'arg1': 2.3, 'arg2': 'tekst3'} Funcja 4: tekst1 4 (4, 3, 'tekst2') {'arg1': 2.3, 'arg2': 'tekst3'} END