Tämä artikkeli auttaa lukijaa jatkamaan edellisestä Python-funktioita käsittelevästä blogista yhdessä joidenkin perus sovellusten kanssa todellisessa maailmassa. Käytämme Visual Studio Codea koodieditorina. Jos et ole asentanut Visual Studio Codea, ohjeet löytyvät ensimmäisestä blogista.

Edistyneet funktiot Pythonissa – sisällysluettelo:

  1. Funktioiden välittäminen toisille funktioille
  2. Funktioiden käyttäminen funktion sisällä
  3. *Args Pythonissa
  4. “*” operaattori Pythonissa
  5. **kwargs Pythonissa

Funktioiden välittäminen toisille funktioille

Kuten edellisessä blogissa keskusteltiin, funktiot Pythonissa käsitellään objekteina. Joten kuten objektit Pythonissa, funktioita voidaan myös välittää argumenttina toiselle funktiolle.

Esimerkiksi:

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

Yllä olevassa koodilohkossa voidaan nähdä, että mul-funktio välitetään argumenttina add-funktiolle ja se tallennetaan x-muuttujaan, joka sitten tulostetaan vastauksen vahvistamiseksi.

100

Funktioiden käyttäminen funktion sisällä

Pythonissa voimme määritellä funktion toisen funktion sisällä. Näitä funktioita kutsutaan sisäkkäisiksi funktioiksi. Mutta tässä käyttötapauksessa sisäistä tai sisäkkäistä funktiota ei voida kutsua erikseen. Molemmat esimerkit on havainnollistettu seuraavassa koodilohkossa.

Kirjoitetaan ensimmäinen funktiomme.

def mul(x, y):
 
    m = x*y
 
    def square(m):
        return m*m
 
    return square(m)
 
 
x = mul(9, 10)
 
print(x)
Output:
8100

Yllä olevassa koodilohkossa ulkoinen funktio on “mul”, joka palauttaa square-funktion, joka ottaa argumentin “m”, joka on kahden “mul”-funktion argumentin tulo. Koodin suoritus alkaa ensin kutsumalla “mul”-funktiota, sitten “x” ja “y” tulos tallennetaan “m”-muuttujaan. Koska tämä funktio palauttaa square-funktion, “square”-funktio kutsutaan ja lopullinen tuote, joka on “m”:n neliö, palautetaan.

Opitaan muutama tärkeä asia Pythonissa, jotka tekevät koodausmatkastasi Pythonin kanssa paljon parempaa.

*Args Pythonissa

Nämä ovat argumentteja, joita käytämme funktion parametreina. Kirjoitetaan tavallinen funktio käyttäen sitä, mitä olemme oppineet tähän mennessä. Kirjoitamme funktion, joka voi antaa meille suorakulmion maksimaalisen pinta-alan, kun annamme 2 suorakulmion pinta-alaa funktion parametreina.

def maxarea(a, b):
    if a > b:
        return f'suorakulmio a:lla on suurempi pinta-ala, joka on {a}'
    else:
        return f'suorakulmio a:lla on suurempi pinta-ala, joka on {b}'
 
 
x = maxarea(100, 60)
print(x)
 
Output:
suorakulmio a:lla on suurempi pinta-ala, joka on 100
[code lang="js"]

Tämä funktio on hyvä 2 parametrille tai argumentille, mutta entä jos meidän täytyy verrata enemmän kuin 2 pinta-alaa. Yksi lähestymistapa olisi välittää lista pinta-aloista funktioon.

def maxarea(lis):
 
    max = 0
    for i in lis:
        if i > max:
            max = i
 
    return f"suorakulmio, jolla on suurempi pinta-ala, on {max}"
 
 
x = maxarea([100, 60, 50])
print(x)
Output:
suorakulmio, jolla on suurempi pinta-ala, on 100

Tämä lähestymistapa on hyvä, mutta meidän pitäisi tietää etukäteen, kuinka monta parametria tai argumenttia annamme. Reaaliaikaisessa koodin suorittamisessa tämä olisi vaivalloista. Joten ohjelmoijan elämän helpottamiseksi Python käyttää *args ja **kwargs.

“*” operaattori Pythonissa

Tämä operaattori on purkuoperaattori, jota käytetään yleensä määrittämättömän määrän parametrien tai argumenttien välittämiseen.

Argumenttien purkaminen tupleksi käyttäen * operaattoria

Kuten olemme nähneet, “*” operaattoria käytetään arvojen purkamiseen. Esimerkki on havainnollistettu alla.


x = [1, 2, 3, 4]
y = [5, 6, 7, 8]
 
z = *x, *y
 
print(type(z))
print(z)
Output:
<class 'tuple'>
(1, 2, 3, 4, 5, 6, 7, 8)

Kuten näemme, purkuoperaattori on purkanut listan x ja listan y tupleksi, joka on z. Voimme myös nähdä, että tulos on tuple.

Kirjoitetaan sama funktio käyttäen *Args.

def maxarea(*lis):
 
    max = 0
    for i in lis:
        if i > max:
            max = i
 
    return f"suorakulmio, jolla on suurempi pinta-ala, on {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)
Output:
suorakulmio, jolla on suurempi pinta-ala, on 200
suorakulmio, jolla on suurempi pinta-ala, on 9000
suorakulmio, jolla on suurempi pinta-ala, on 100

Tässä koodilohkossa voimme nähdä, että nyt argumentit ovat dynaamisia, voimme lisätä minkä tahansa määrän argumentteja, jotka puretaan maxarea-funktioon, jotta saamme halutun tuloksen. Voimme myös verrata mitä tahansa pinta-aloja tässä kontekstissa.

**kwargs Pythonissa

kwargs on kuin args, mutta se hyväksyy paikkansa pitävät argumentit. Se käyttää ** operaattoria, jolla on joitakin ominaisuuksia, kuten useiden paikkansa pitävien argumenttien purkaminen minkä tahansa pituuden mukaan, voi myös purkaa sanakirjoja, voi myös yhdistää kaksi sanakirjaa.

Sanakirjojen yhdistäminen

a = {"h": 1, "n": 2}
b = {"m": 5, "l": 10}
 
c = {**a, **b}
 
print(type(c))
print(c)
 

Voimme nähdä yllä olevasta koodista, että meillä on 2 sanakirjaa a ja b, jotka on yhdistetty käyttäen ** operaattoria, jotta saadaan toinen sanakirja.
Output:
 
<class 'dict'>
{'h': 1, 'n': 2, 'm': 5, 'l': 10}

Kun käytämme * operaattoria ** operaattorin sijaan, tämän tapauksen koodi on havainnollistettu alla.

a = {"h": 1, "n": 2}
b = {"m": 5, "l": 10}
 
c = {*a, *b}
 
print(type(c))
print(c)
Output:
<class 'set'>
{'n', 'l', 'm', 'h'}

Joten, kun * operaattoria käytetään kahden sanakirjan yhdistämiseen, tulos on joukko, jossa on vain avaimet sanakirjasta.

maxarea-funktio käyttäen **kwargs on havainnollistettu alla olevassa koodilohkossa.

def maxarea(**lis):
 
    max = 0
    for i in lis.values():
        if i > max:
            max = i
 
    return f"suorakulmio, jolla on suurempi pinta-ala, on {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)
Output:
suorakulmio, jolla on suurempi pinta-ala, on 3
suorakulmio, jolla on suurempi pinta-ala, on 2
suorakulmio, jolla on suurempi pinta-ala, on 9

Tässä blogissa edistyneistä funktioista Pythonissa olemme käsitelleet aiheita, kuten funktioiden välittäminen toisille funktioille, funktioiden käyttäminen funktion sisällä, *Args Pythonissa, “*” operaattori Pythonissa, **kwargs Pythonissa ja paljon muuta. Tulevat aiheet, jotka sisältävät luokkia, käsitellään seuraavassa blogikirjoituksessa. Kotitehtävät edistyneistä funktioista Pythonissa on annettu alla.

edistyneet_funktiot_Pythonissa

Agnieszka Markowska-Szmaj

View all posts →