Úvod
Python je jedním z nejpopulárnějších programovacích jazyků na světě. V Pythonu jsou parametry součástí definic funkcí. Umožňují vám specifikovat určité argumenty pro funkci. Argument může být funkcí přijat a aplikován.
Při psaní kódu však nemůžete vědět, jaké přesné případy použití mohou být s vaším kódem implementovány. Proto je v zájmu budoucích programátorů a uživatelů vašeho programu vhodné předávat funkci proměnný počet argumentů. K tomu musíte použít speciální parametry. Jedná se o *args a **kwargs. V tomto návodu se naučíme vše o parametrech *args a **kwargs v Pythonu. Naučíme se také, jak řadit argumenty a jak je aplikovat při volání funkcí.
Požadavky
Abyste mohli postupovat podle kroků v tomto návodu, musíte si připravit několik věcí. Nejprve musíte mít nainstalovaný Python 3 na vašem serveru se spuštěným programovacím prostředím. Musíte mít také nainstalovaný program pro váš konkrétní operační systém (Ubuntu, CentOS, Debian atd.).
Co je *args a jak to funguje?
Začněme tím, že pochopíme, jak funguje *args funguje. Verze parametru s jednou hvězdičkou se používá k odesílání seznamů argumentů s proměnnou délkou bez klíčových slov do funkcí. Mějte na paměti, že hvězdička je nejdůležitějším prvkem tohoto parametru.
Pro lepší pochopení si uveďme příklad. Následuje typická funkce se dvěma argumenty, kterou můžete najít ve svém kódu:
|
1 2 |
def multiply(x, y): print (x * y) |
Jak vidíte, naše argumenty ve výše uvedené funkci jsou x a y. Při volání funkce použijete čísla odpovídající x a y. Řekněme, že předáváme celá čísla 5 a 4 pro x a y v tomto pořadí:
|
1 2 3 4 |
def multiply(x, y): print (x * y) multiply(5, 4) |
Nyní můžeme kód spustit:
|
1 |
python lets_multiply.py |
Výstup, který obdržíme, bude následující:
|
1 2 3 |
Výstup: 20 |
Výstup ukazuje, že celá čísla 5 a 4 byla vynásobena. To znamená, že funkce multiply(x, y) fungovala.
Nyní řekněme, že bychom chtěli nakonec vynásobit tři čísla namísto pouhých dvou. Přidání dalšího čísla do výše uvedené funkce bohužel povede k následující chybě:
|
1 2 3 4 |
def multiply(x, y): print (x * y) multiply(5, 4, 3) |
|
1 2 3 |
Výstup: TypeError: multiply() takes 2 positional arguments but 3 were given |
Proto pokud tušíte, že budete muset někdy později přidat další argumenty, použijte pro své pohodlí parametr *args. Můžete jej použít takto:
|
1 2 3 4 5 6 7 8 9 10 |
def multiply(*args): z = 1 for num in args: z *= num print(z) multiply(4, 5) multiply(10, 9) multiply(2, 3, 4) multiply(3, 5, 10, 6) |
Jednoduše jsme nahradili parametry funkce x a y parametrem *args. Spuštěním tohoto kódu získáte součin pro každé jednotlivé volání funkce takto:
|
1 2 3 4 5 6 |
Výstup: 20 90 24 900 |
Tudíž *args je ideální použít, když chcete funkci poslat seznamy argumentů s proměnnou délkou. Díky této schopnosti můžete voláním funkcí předat tolik argumentů, kolik chcete. Tento parametr vám tak umožňuje vytvářet flexibilnější kód, který dokáže do funkce přijmout velké množství proměnných argumentů bez klíčových slov.
Co je **kwargs a jak to funguje?
Dále tu máme verzi parametrů se dvěma hvězdičkami, což je **kwargs. Na rozdíl od předchozí formy vám tento parametr umožňuje předávat do funkce slovníky argumentů s klíčovými slovy a proměnnou délkou. Podobně jako *args, dvě hvězdičky jsou nejdůležitějším prvkem parametru.
Stejně jako v předchozí části můžete přidat tolik argumentů, kolik chcete. Rozdíl je v tom, že musíte přiřadit klíčová slova. Pro lepší pochopení zvažte následující příklad. Zde začneme vypsáním **kwargs argumentů, které chceme předat funkci:
|
1 2 |
def print_kwargs(**kwargs): print(kwargs) |
Nyní funkci zavolejme. Jak vidíte, přidali jsme klíčové argumenty:
|
1 2 3 4 |
def print_kwargs(**kwargs): print(kwargs) print_kwargs(kwargs_1="Shark", kwargs_2=4.5, kwargs_3=True) |
Spuštění programu v tomto okamžiku vám ukáže tento výstup:
|
1 |
python print_kwargs.py |
|
1 2 3 |
Výstup: {'kwargs_3': True, 'kwargs_2': 4.5, 'kwargs_1': 'Shark'} |
Existuje však možnost, že váš datový typ slovníku je neuspořádaný. To do značné míry závisí na verzi Pythonu 3, kterou používáte. Například jakákoli verze novější než Python 3.6 vám poskytne páry klíč-hodnota v pořadí. Jakákoli starší verze zobrazí výstup v náhodném pořadí. Slovník, který vytvoříte, se bude jmenovat kwargs. Všimněte si, že jej můžete používat a manipulovat s ním jako s jakýmkoli jiným slovníkem v systému. Podívejme se, jak můžete parametr **kwargs více využít a uplatnit.
V následujícím příkladu se pokusíme vytvořit novou funkci, která pozdraví slovník se jmény. Náš ukázkový slovník bude mít dvě jména:
|
1 2 3 4 5 |
def print_values(**kwargs): for key, value in kwargs.items(): print("The value of {} is {}".format(key, value)) print_values(my_name="Sammy", your_name="Casey") |
Spuštění programu vám poskytne tento výstup:
|
1 |
python print_values.py |
|
1 2 3 4 |
Výstup: The value of your_name is Casey The value of my_name is Sammy |
Podobně jako v předchozím příkladu se může zdát, že slovníky jsou neuspořádané. Jako takové může být pořadí jmen Casey a Sammy v některých případech obrácené.
Dále předáme funkci další argumenty. To dokáže, že můžete nastavit **kwargs tak, aby přijímal libovolný počet argumentů, který chcete:
|
1 2 3 4 5 6 7 8 9 10 11 |
def print_values(**kwargs): for key, value in kwargs.items(): print("The value of {} is {}".format(key, value)) print_values( name_1="Alex", name_2="Gray", name_3="Harper", name_4="Phoenix", name_5="Remy", name_6="Val") |
Spuštění programu vám ukáže tento výstup:
|
1 2 3 4 5 6 7 8 |
Výstup: The value of name_2 is Gray The value of name_6 is Val The value of name_4 is Phoenix The value of name_5 is Remy The value of name_3 is Harper The value of name_1 is Alex |
Tento výstup může být také neuspořádaný. Bez ohledu na to tyto příklady ukazují, že **kwargs dává vašemu programu flexibilitu používat libovolné množství klíčových argumentů.
Jak řadit argumenty
Při řazení argumentů ve funkci nebo volání funkce je důležité mít na paměti stanovené pořadí. Je následující:
-
Formální poziční argumenty
-
*args
-
Klíčové argumenty
-
**kwargs
Řekněme, že používáte *args a **kwargs s explicitními pozičními parametry. To znamená, že vaše funkce bude vypadat takto:
|
1 2 |
def example(arg_1, arg_2, *args, **kwargs): ... |
Na druhou stranu, použití těchto parametrů s pojmenovanými klíčovými parametry poskytne vaší funkci následující obecnou strukturu:
|
1 2 |
def example2(arg_1, arg_2, *args, kw_1="shark", kw_2="blobfish", **kwargs): ... |
Nedodržení stanoveného pořadí povede při spuštění kódu k syntaktické chybě. Proto je nejlepší se této chybě hned na začátku vyhnout.
Jak používat *args a **kwargs ve voláních funkcí
Na závěr si ukážeme, jak oba parametry použít k předávání argumentů do funkcí. Začneme příkladem, který ukazuje *args:
|
1 2 3 4 5 6 7 8 |
def some_args(arg_1, arg_2, arg_3): print("arg_1:", arg_1) print("arg_2:", arg_2) print("arg_3:", arg_3) args = ("Sammy", "Casey", "Alex") some_args(*args) |
V této funkci jsou tři parametry: arg_1, arg_2, a arg_3. Musíte vytvořit proměnnou a nastavit ji na iterovatelný objekt. V tomto případě to bude tuple. Poté můžete proměnnou předat do funkce pomocí syntaxe s hvězdičkou.
Sledujte výstup, když spustíte program pomocí python some_args.py příkazu:
|
1 2 3 4 5 |
Výstup: arg_1: Sammy arg_2: Casey arg_3: Alex |
Program je také možné změnit na iterovatelný seznam datový typ s jiným názvem proměnné. Následující kód kombinuje *args s pojmenovaným parametrem:
|
1 2 3 4 5 6 7 8 |
def some_args(arg_1, arg_2, arg_3): print("arg_1:", arg_1) print("arg_2:", arg_2) print("arg_3:", arg_3) my_list = [2, 3] some_args(1, *my_list) |
Výstup po spuštění programu bude následující:
|
1 2 3 4 5 |
Výstup: arg_1: 1 arg_2: 2 arg_3: 3 |
Na druhou stranu můžete použít klíčové argumenty s **kwargs. Nezapomeňte vytvořit proměnnou, která se rovná slovníku. Měla by mít 2 páry klíč-hodnota. Zde je návod, jak předáme proměnnou funkci se 3 argumenty:
|
1 2 3 4 5 6 7 8 |
def some_kwargs(kwarg_1, kwarg_2, kwarg_3): print("kwarg_1:", kwarg_1) print("kwarg_2:", kwarg_2) print("kwarg_3:", kwarg_3) kwargs = {"kwarg_1": "Val", "kwarg_2": "Harper", "kwarg_3": "Remy"} some_kwargs(**kwargs) |
Použijte python some_kwargs.py příkaz ještě jednou pro spuštění programu:
|
1 2 3 4 5 |
Výstup: kwarg_1: Val kwarg_2: Harper kwarg_3: Remy |
Závěr
Na konci tohoto návodu byste měli dobře rozumět tomu, co jsou *args a **kwargs a jak fungují. Nyní můžete tyto parametry aplikovat ve svém vlastním kódu, aby byl váš program flexibilní pro budoucí uživatele. Tyto parametry jsou ideální pro situace, kdy nevíte, kolik argumentů může být použito. Jen se ujistěte, že si dáváte pozor na klíčové prvky funkcí a parametrů.
Na závěr uvádíme další zdroje z našeho blogu, které vám pomohou úspěšně pracovat s Pythonem:
- Formát souboru txt: Práce s čistě textovými soubory v Pythonu 3
- Cykly v Pythonu 3: Použití příkazů Break, Continue a Pass
- Importování modulů v Pythonu 3: Komplexní průvodce
- Použití formátování řetězců v Pythonu 3
- Programování v Pythonu 3: Jak postupovat při vytváření tříd a definování objektů?
Přejeme příjemné programování!
Komentáře
Zatím žádné komentáře. Buďte první.