Č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:

  1. Predávanie funkcií iným funkciám
  2. Používanie funkcií vo vnútri funkcie
  3. *Args v Pythone
  4. “*” operátor v Pythone
  5. **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.

advanced_functions_in_Python

Agnieszka Markowska-Szmaj

View all posts →