Článok pomôže čitateľovi pokračovať od predchádzajúceho blogu o funkciách v Pythone spolu s niektorými základnými aplikáciami v reálnom svete. Na písanie kódu budeme používať Visual Studio Code ako náš editor kódu. Ak ste si ešte nenainštalovali Visual Studio Code, pokyny sú uvedené v prvom blogu.
Pokročilé funkcie v Pythone – obsah:
- Predávanie funkcií iným funkciám
- Používanie funkcií vo vnútri funkcie
- *Args v Pythone
- “*” operátor v Pythone
- **kwargs v Pythone
Predávanie funkcií iným funkciám
Ako bolo diskutované v predchádzajúcom blogu, funkcie v Pythone sú považované za objekty. Takže ako objekty v Pythone, funkcie môžu byť tiež predávané ako argument inej funkcii.
Príklad:
def mul(x, y): return x*y def add(mul, y): return mul+y x = add(mul(9, 10), 10) print(x)
V uvedenom bloku kódu je vidieť, že funkcia mul je predaná ako argument funkcii add a je uložená v premennej x, ktorá je potom vytlačená na overenie odpovede.
100
Používanie funkcií vo vnútri funkcie
V Pythone môžeme definovať funkciu vo vnútri inej funkcie. Tieto funkcie sa nazývajú vnorené funkcie. Ale v tomto prípade nemôže byť vnútorná funkcia alebo vnorená funkcia volaná samostatne. Obe príklady sú ilustrované v nasledujúcom bloku kódu.
Napíšme našu prvú funkciu.
def mul(x, y): m = x*y def square(m): return m*m return square(m) x = mul(9, 10) print(x)
Výstup: 8100
V uvedenom bloku kódu je vonkajšia funkcia “mul”, ktorá vracia funkciu square, ktorá berie argument “m”, čo je súčin dvoch argumentov daných funkcii “mul”. Spustenie kódu začína volaním funkcie “mul”, potom sa súčin “x” a “y” uloží do premennej “m”. Keďže táto funkcia vracia funkciu square, funkcia “square” je volaná a konečný súčin, ktorý je druhou mocninou “m”, je vrátený.
Poďme sa naučiť niekoľko dôležitých vecí v Pythone, ktoré urobia vašu cestu kódovania s Pythonom oveľa lepšou.
*Args v Pythone
Toto sú argumenty, ktoré používame ako parametre funkcie. Napíšme bežnú funkciu pomocou toho, čo sme sa doteraz naučili. Napíšeme funkciu, ktorá nám môže dať maximálnu plochu obdĺžnika, ak sú parametrami funkcie 2 plochy obdĺžnikov.
def maxarea(a, b): if a > b: return f'obdĺžnik a má väčšiu plochu, ktorá je {a}' else: return f'obdĺžnik a má väčšiu plochu, ktorá je {b}' x = maxarea(100, 60) print(x)
Výstup: obdĺžnik a má väčšiu plochu, ktorá je 100
Táto funkcia je dobrá pre 2 parametre alebo argumenty, ale čo ak potrebujeme porovnať viac ako 2 plochy. Jedným prístupom by bolo predanie zoznamu plôch do funkcie.
def maxarea(lis): max = 0 for i in lis: if i > max: max = i return f"obdĺžnik, ktorý má väčšiu plochu, je {max}" x = maxarea([100, 60, 50]) print(x)
Výstup: obdĺžnik, ktorý má väčšiu plochu, je 100
Tento prístup je dobrý, ale mali by sme vedieť počet parametrov alebo argumentov, ktoré máme dať, vopred. V reálnom čase by to bolo nepríjemné. Preto, aby sme uľahčili život programátorom, Python používa *args a **kwargs.
“*” operátor v Pythone
Tento operátor je operátor rozbalenia, ktorý sa zvyčajne používa na predanie nešpecifikovaného počtu parametrov alebo argumentov.
Rozbalenie argumentov do n-tice pomocou * operátora
Ako sme videli, operátor “*” sa používa na rozbalenie hodnôt. Príklad je ilustrovaný nižšie.
x = [1, 2, 3, 4] y = [5, 6, 7, 8] z = *x, *y print(type(z)) print(z)
Výstup: <class 'tuple'> (1, 2, 3, 4, 5, 6, 7, 8)
Ako vidíme, operátor rozbalenia rozbalil zoznam x a zoznam y do n-tice, ktorou je z. Môžeme tiež vidieť, že výsledok je n-tica.
Napíšme rovnakú funkciu pomocou *Args.
def maxarea(*lis): max = 0 for i in lis: if i > max: max = i return f"obdĺžnik, ktorý má väčšiu plochu, je {max}" x = maxarea(100, 60, 50, 200) y = maxarea(100, 60, 50, 200, 9000) z = maxarea(100, 60, 50, 20, 90) print(x) print(y) print(z)
Výstup: obdĺžnik, ktorý má väčšiu plochu, je 200 obdĺžnik, ktorý má väčšiu plochu, je 9000 obdĺžnik, ktorý má väčšiu plochu, je 100
V tomto bloku kódu vidíme, že argumenty sú teraz dynamické, môžeme pridať akýkoľvek počet argumentov, ktoré budú rozbalené vo funkcii maxarea, aby nám poskytli požadovaný výsledok. Taktiež môžeme porovnať akýkoľvek počet plôch v tomto kontexte.
**kwargs v Pythone
kwargs je ako args, ale akceptuje pozičné argumenty. Používa ** operátor, ktorý má niektoré atribúty, ako je rozbalenie viacerých pozičných argumentov akejkoľvek dĺžky, môže tiež rozbaliť slovníky, môže sa tiež použiť na kombinovanie dvoch slovníkov.
Spájanie slovníkov
a = {"h": 1, "n": 2} b = {"m": 5, "l": 10} c = {**a, **b} print(type(c)) print(c) Z vyššie uvedeného kódu vidíme, že máme 2 slovníky a a b, ktoré sú spojené pomocou ** operátora, aby vytvorili ďalší slovník. Výstup: <class 'dict'> {'h': 1, 'n': 2, 'm': 5, 'l': 10}
Keď použijeme * operátor namiesto ** operátora, kód pre tento prípad je ilustrovaný nižšie.
a = {"h": 1, "n": 2} b = {"m": 5, "l": 10} c = {*a, *b} print(type(c)) print(c)
Výstup: <class 'set'> {'n', 'l', 'm', 'h'}
Preto, keď sa * operátor použije na dva slovníky na zlúčenie, výsledkom bude množina iba s kľúčmi zo slovníka.
Funkcia maxarea pomocou **kwargs je ilustrovaná v nasledujúcom bloku kódu.
def maxarea(**lis): max = 0 for i in lis.values(): if i > max: max = i return f"obdĺžnik, ktorý má väčšiu plochu, je {max}" x = maxarea(a=1, b=2, c=3) y = maxarea(a=1, b=2) z = maxarea(a=1, b=2, c=3, d=9) print(x) print(y) print(z)
Výstup: obdĺžnik, ktorý má väčšiu plochu, je 3 obdĺžnik, ktorý má väčšiu plochu, je 2 obdĺžnik, ktorý má väčšiu plochu, je 9
V tomto blogu o pokročilých funkciách v Pythone sme pokryli témy ako predávanie funkcií iným funkciám, používanie funkcií vo vnútri funkcie, *Args v Pythone, “*” operátor v Pythone, **kwargs v Pythone a ďalšie. Ďalšie témy, ktoré zahŕňajú triedy, budú pokryté v nasledujúcom blogovom príspevku. Domáca úloha týkajúca sa pokročilých funkcií v Pythone je uvedená nižšie.
Agnieszka Markowska-Szmaj
Python Course From Beginner to Advanced in 11 blog posts:
- Pythonové n-tice, zoznamy, množiny a slovníky. Časť 3 Python kurzu od začiatočníka po pokročilého v 11 blogových príspevkoch
- Python funkcie. Časť 7 Python kurzu od začiatočníka po pokročilého v 11 blogových príspevkoch
- Úvod do kurzu Python. Časť 1: Kurz Python od začiatočníka po pokročilého v 11 blogových príspevkoch
- Premenné a typy údajov v Pythone. Časť 2 Python kurzu od začiatočníka po pokročilého v 11 blogových príspevkoch
- Python množiny a slovníky. Časť 4 Python kurzu od začiatočníka po pokročilého v 11 blogových príspevkoch
- Python trieda a objekty. Časť 9 Python kurz od začiatočníka po pokročilého v 11 blogových príspevkoch
- Súbory v Pythone. Časť 10 Python kurzu od začiatočníka po pokročilého v 11 blogových príspevkoch
- Slučky v Pythone. Časť 6 Python kurzu od začiatočníka po pokročilého v 11 blogových príspevkoch
- Pokročilé funkcie v Pythone. Časť 8 Python kurzu od začiatočníka po pokročilého v 11 blogových príspevkoch