Článek pomůže čtenáři navázat na předchozí blog o funkcích v Pythonu spolu s některými základními aplikacemi v reálném světě. Jako náš editor kódu budeme používat Visual Studio Code. Pokud jste si Visual Studio Code ještě nenainstalovali, pokyny jsou uvedeny v prvním blogu.

Pokročilé funkce v Pythonu – obsah:

  1. Předávání funkcí jiným funkcím
  2. Používání funkcí uvnitř funkce
  3. *Args v Pythonu
  4. “*” operátor v Pythonu
  5. **kwargs v Pythonu

Předávání funkcí jiným funkcím

Jak bylo diskutováno v předchozím blogu, funkce v Pythonu jsou považovány za objekty. Takže stejně jako objekty v Pythonu, mohou být funkce také předávány jako argumenty jiné funkci.

Například:

def mul(x, y):
    return x*y
 
 
def add(mul, y):
    return mul+y
 
 
x = add(mul(9, 10), 10)
print(x)

V uvedeném bloku kódu je vidět, že funkce mul je předána jako argument funkci add a je uložena do proměnné x, která je poté vytištěna pro ověření odpovědi.

100

Používání funkcí uvnitř funkce

V Pythonu můžeme definovat funkci uvnitř jiné funkce. Tyto funkce se nazývají vnořené funkce. Ale v tomto případě nemůže být vnitřní funkce nebo vnořená funkce volána samostatně. Oba příklady jsou ilustrovány v následujícím bloku kódu.

Pojďme napsat naši první funkci.

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 uvedeném bloku kódu je vnější funkcí “mul”, která vrací funkci square, jež přijímá argument “m”, což je násobení dvou argumentů předaných funkci “mul”. Spuštění kódu začíná voláním funkce “mul”, poté se produkt “x” a “y” uloží do proměnné “m”. Jak tato funkce vrací funkci square, je volána funkce “square” a konečný produkt, což je čtverec “m”, je vrácen.

Pojďme se naučit několik důležitých věcí v Pythonu, které učiní vaši cestu programováním v Pythonu mnohem lepší.

*Args v Pythonu

To jsou argumenty, které používáme jako parametry funkcí. Pojďme napsat obvyklou funkci pomocí toho, co jsme se dosud naučili. Napišeme funkci, která nám může poskytnout maximální plochu obdélníku, přičemž jako parametry funkce použijeme 2 plochy obdélníků.

def maxarea(a, b):
    if a > b:
        return f'obdélník a má větší plochu, která je {a}'
    else:
        return f'obdélník a má větší plochu, která je {b}'
 
 
x = maxarea(100, 60)
print(x)
 
Výstup:
obdélník a má větší plochu, která je 100

Tato funkce je dobrá pro 2 parametry nebo argumenty, ale co když potřebujeme porovnat více než 2 plochy. Jeden přístup by byl předat seznam ploch do funkce.

def maxarea(lis):
 
    max = 0
    for i in lis:
        if i > max:
            max = i
 
    return f"obdélník, který má větší plochu, je {max}"
 
 
x = maxarea([100, 60, 50])
print(x)
Výstup:
obdélník, který má větší plochu, je 100

Tento přístup je dobrý, ale měli bychom znát počet parametrů nebo argumentů předem. Při reálném provádění kódu by to bylo obtížné. Proto, aby se programátorům usnadnil život, Python používá *args a **kwargs.

“*” operátor v Pythonu

Tento operátor je operátor pro rozbalení, který se obvykle používá k předání neurčitého počtu parametrů nebo argumentů.

Rozbalení argumentů do n-tice pomocí * operátoru

Jak jsme viděli, operátor “*” se používá k rozbalení hodnot. Příklad je ilustrován níže.


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)

Jak vidíme, operátor pro rozbalení rozbalil seznam x a seznam y do n-tice, což je z. Můžeme také vidět, že výsledek je n-tice.

Pojďme napsat stejnou funkci pomocí *Args.

def maxarea(*lis):
 
    max = 0
    for i in lis:
        if i > max:
            max = i
 
    return f"obdélník, který má větší 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élník, který má větší plochu, je 200
obdélník, který má větší plochu, je 9000
obdélník, který má větší plochu, je 100

V tomto bloku kódu vidíme, že nyní jsou argumenty dynamické, můžeme přidat libovolný počet argumentů, které budou rozbaleny ve funkci maxarea, abychom získali požadovaný výsledek. Také můžeme porovnat libovolný počet ploch v tomto kontextu.

**kwargs v Pythonu

kwargs je jako args, ale přijímá poziční argumenty. Používá ** operátor, který má některé vlastnosti, jako je rozbalení více pozičních argumentů libovolné délky, může také rozbalit slovníky, může být také použit pro kombinování dvou slovníků.

Sloučení slovníků

a = {"h": 1, "n": 2}
b = {"m": 5, "l": 10}
 
c = {**a, **b}
 
print(type(c))
print(c)
 
Můžeme vidět z výše uvedeného kódu, že máme 2 slovníky a a b, které jsou sloučeny pomocí ** operátoru, aby daly další slovník.
Výstup:
 
<class 'dict'>
{'h': 1, 'n': 2, 'm': 5, 'l': 10}

Když použijeme * operátor místo ** operátoru, kód pro tento případ je ilustrován níže.

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'}

Proto, když je * operátor použit na dva slovníky pro sloučení, výstup bude množina pouze s klíči ze slovníku.

Funkce maxarea pomocí **kwargs je ilustrována v níže uvedeném bloku kódu.

def maxarea(**lis):
 
    max = 0
    for i in lis.values():
        if i > max:
            max = i
 
    return f"obdélník, který má větší 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élník, který má větší plochu, je 3 obdélník, který má větší plochu, je 2 obdélník, který má větší plochu, je 9 [/code>

V tomto blogu o pokročilých funkcích v Pythonu jsme pokryli témata jako předávání funkcí jiným funkcím, používání funkcí uvnitř funkce, *Args v Pythonu, “*” operátor v Pythonu, **kwargs v Pythonu a další. Další témata, která zahrnují třídy, budou pokryta v dalším blogovém příspěvku. Domácí úkol týkající se pokročilých funkcí v Pythonu je uveden níže.

pokročilé_funkce_v_Pythonu

Agnieszka Markowska-Szmaj

View all posts →