logo

Sisustajat Pythonissa

Sisustajat ovat erittäin tehokas ja hyödyllinen työkalu Pythonissa, koska sen avulla ohjelmoijat voivat muokata funktion tai luokan käyttäytymistä. Sisustajat sallivat meidän kääriä toisen toiminnon laajentaaksemme käärityn funktion käyttäytymistä muuttamatta sitä pysyvästi. Mutta ennen kuin sukeltaa syvälle sisustajiin, meidän on ymmärrettävä joitain käsitteitä, joista on hyötyä sisustajien oppimisessa.

Ensiluokkaiset esineet
Pythonissa funktiot ovat ensimmäisen luokan esineitä mikä tarkoittaa, että Pythonin toimintoja voidaan käyttää tai välittää argumentteina.
Ensimmäisen luokan funktioiden ominaisuudet:

  • Funktio on objektityypin esiintymä.
  • Voit tallentaa funktion muuttujaan.
  • Voit siirtää funktion parametrina toiselle funktiolle.
  • Voit palauttaa funktion funktiosta.
  • Voit tallentaa ne tietorakenteisiin, kuten hash-taulukoihin, listoihin,…

Harkitse alla olevia esimerkkejä ymmärtääksesi paremmin.



Esimerkki 1: Toimintojen käsitteleminen esineinä.

Python 3








# Python program to illustrate functions> # can be treated as objects> def> shout(text):> >return> text.upper()> print>(shout(>'Hello'>))> yell>=> shout> print>(yell(>'Hello'>))>

>

>

Lähtö:

HELLO HELLO>

Yllä olevassa esimerkissä olemme määrittäneet funktion huuto muuttujalle. Tämä ei kutsu funktiota, vaan se ottaa funktioobjektin, johon huuto viittaa, ja luo siihen osoittavan toisen nimen, huuto.

Esimerkki 2: Toiminnon välittäminen argumenttina

Python 3




# Python program to illustrate functions> # can be passed as arguments to other functions> def> shout(text):> >return> text.upper()> def> whisper(text):> >return> text.lower()> def> greet(func):> ># storing the function in a variable> >greeting>=> func(>'''Hi, I am created by a function passed as an argument.'''>)> >print> (greeting)> greet(shout)> greet(whisper)>

>

>

Lähtö:

HI, I AM CREATED BY A FUNCTION PASSED AS AN ARGUMENT. hi, i am created by a function passed as an argument.>

Yllä olevassa esimerkissä tervehdysfunktio ottaa toisen funktion parametriksi (tässä tapauksessa huutaa ja kuiskaa). Argumenttina välitetty funktio kutsutaan sitten tervehdysfunktion sisällä.

Esimerkki 3: Toimintojen palauttaminen toisesta funktiosta.

Python 3




kat timpf korkeus
# Python program to illustrate functions> # Functions can return another function> def> create_adder(x):> >def> adder(y):> >return> x>+>y> >return> adder> add_15>=> create_adder(>15>)> print>(add_15(>10>))>

>

>

Lähtö:

25>

Yllä olevassa esimerkissä olemme luoneet funktion toisen funktion sisään ja sitten palauttaneet sisällä luodun funktion.
Yllä olevat kolme esimerkkiä kuvaavat tärkeitä käsitteitä, joita tarvitaan sisustajien ymmärtämiseen. Käytyämme ne läpi, sukeltakaamme nyt syvälle sisustajiin.

Sisustajat

Kuten edellä todettiin, sisustajia käytetään muokkaamaan funktion tai luokan käyttäytymistä. Decoratorsissa funktiot otetaan argumenttina toiseen funktioon ja kutsutaan sitten käärefunktion sisällä.

Syntaksi sisustajalle:

@gfg_decorator def hello_decorator(): print('Gfg') '''Above code is equivalent to - def hello_decorator(): print('Gfg') hello_decorator = gfg_decorator(hello_decorator)'''>

Yllä olevassa koodissa gfg_decorator on kutsuttava funktio, joka lisää jonkin toisen kutsuttavan funktion, hello_decorator-funktion päälle koodia ja palauttaa käärefunktion.

Sisustaja voi muokata käyttäytymistä :

Python 3




# defining a decorator> def> hello_decorator(func):> ># inner1 is a Wrapper function in> ># which the argument is called> > ># inner function can access the outer local> ># functions like in this case 'func'> >def> inner1():> >print>(>'Hello, this is before function execution'>)> ># calling the actual function now> ># inside the wrapper function.> >func()> >print>(>'This is after function execution'>)> > >return> inner1> # defining a function, to be called inside wrapper> def> function_to_be_used():> >print>(>'This is inside the function !!'>)> # passing 'function_to_be_used' inside the> # decorator to control its behaviour> function_to_be_used>=> hello_decorator(function_to_be_used)> # calling the function> function_to_be_used()>

>

kmp-algoritmi
>

Lähtö:

Hello, this is before function execution This is inside the function !! This is after function execution>

Katsotaanpa yllä olevan koodin käyttäytymistä ja kuinka se toimii askel askeleelta, kun funktiota_to_be_used kutsutaan.

Siirrytään toiseen esimerkkiin, josta voimme helposti selvittää funktion suoritusaika sisustajaa käyttämällä.

Python 3




# importing libraries> import> time> import> math> # decorator to calculate duration> # taken by any function.> def> calculate_time(func):> > ># added arguments inside the inner1,> ># if function takes any arguments,> ># can be added like this.> >def> inner1(>*>args,>*>*>kwargs):> ># storing time before function execution> >begin>=> time.time()> > >func(>*>args,>*>*>kwargs)> ># storing time after function execution> >end>=> time.time()> >print>(>'Total time taken in : '>, func.__name__, end>-> begin)> >return> inner1> # this can be added to any function present,> # in this case to calculate a factorial> @calculate_time> def> factorial(num):> ># sleep 2 seconds because it takes very less time> ># so that you can see the actual difference> >time.sleep(>2>)> >print>(math.factorial(num))> # calling the function.> factorial(>10>)>

>

>

Lähtö:

3628800 Total time taken in : factorial 2.0061802864074707>

Entä jos funktio palauttaa jotain tai funktiolle välitetään argumentti?

Kaikissa yllä olevissa esimerkeissä funktiot eivät palauttaneet mitään, joten ongelmaa ei ollut, mutta palautettu arvo saattaa olla tarpeen.

Python 3




def> hello_decorator(func):> >def> inner1(>*>args,>*>*>kwargs):> > >print>(>'before Execution'>)> > ># getting the returned value> >returned_value>=> func(>*>args,>*>*>kwargs)> >print>(>'after Execution'>)> > ># returning the value to the original frame> >return> returned_value> > >return> inner1> # adding decorator to the function> @hello_decorator> def> sum_two_numbers(a, b):> >print>(>'Inside the function'>)> >return> a>+> b> a, b>=> 1>,>2> # getting the value through return of the function> print>(>'Sum ='>, sum_two_numbers(a, b))>

>

>

Lähtö:

before Execution Inside the function after Execution Sum = 3>

Yllä olevassa esimerkissä saatat huomata terävän eron sisäisen funktion parametreissa. Sisäinen funktio ottaa argumentin muodossa *args ja **kwargs, mikä tarkoittaa, että joukko sijaintiargumentteja tai avainsanaargumenttien sanakirja voidaan välittää minkä pituisina tahansa. Tämä tekee siitä yleisen sisustajan, joka voi koristella funktiota, jolla on useita argumentteja.

Ketjuttavat sisustajat

Yksinkertaisemmin sanottuna sisustajien ketjuttaminen tarkoittaa toiminnon sisustamista useilla sisustajilla.

Esimerkki:

Python 3




# code for testing decorator chaining> def> decor1(func):> >def> inner():> >x>=> func()> >return> x>*> x> >return> inner> def> decor(func):> >def> inner():> >x>=> func()> >return> 2> *> x> >return> inner> @decor1> @decor> def> num():> >return> 10> @decor> @decor1> def> num2():> >return> 10> > print>(num())> print>(num2())>

>

>

Lähtö:

400 200>

Yllä oleva esimerkki on samanlainen kuin funktion kutsuminen nimellä -

decor1(decor(num)) decor(decor1(num2))>