Kaj je Lambda funkcija v Pythonu?
Lambda Funkcija v Python programiranja je anonimna funkcija ali funkcija, ki nima imena. To je majhna in omejena funkcija, ki nima več kot ene vrstice. Tako kot običajna funkcija ima lahko tudi Lambda funkcija več argumentov z enim izrazom.
V Pythonu se lambda izrazi (ali lambda oblike) uporabljajo za izdelavo anonimnih funkcij. Če želite to narediti, boste uporabili ključno besedo lambda (tako kot z def definirate običajne funkcije). Vsaka anonimna funkcija, ki jo definirate v Pythonu, bo imela tri bistvene dele:
- Ključna beseda lambda.
- Parametri (ali vezane spremenljivke) in
- Telo funkcije.
Lambda funkcija ima lahko poljubno število parametrov, vendar telo funkcije lahko vsebuje samo en izraz. Poleg tega je lambda napisana v eni vrstici kode in jo je mogoče tudi takoj poklicati. Vse to boste videli v prihodnjih primerih.
V tej vadnici Lambda in Python boste izvedeli:
- Sintaksa in primeri
- Uporaba lambdas z vgrajenimi Pythoni
- lambda v filtru ()
- lambde na zemljevidu ()
- lambda v znižanju ()
- Zakaj (in zakaj ne) uporabljati lambda funkcije?
- Lambda proti običajnim funkcijam
Sintaksa in primeri
Formalna sintaksa za zapis lambda funkcije je podana spodaj:
lambda p1, p2: expression
Tu sta p1 in p2 parametra, ki sta posredovana lambda funkciji. Dodate lahko toliko ali malo parametrov, kot jih potrebujete.
Vendar upoštevajte, da okrog parametrov ne uporabljamo oklepajev, kot pri običajnih funkcijah. Zadnji del (izraz) je kateri koli veljaven izraz python, ki deluje na parametre, ki jih posredujete funkciji.
Primer 1
Zdaj, ko veste o lambdah, poskusimo s primerom. Torej, odprite svoj IDLE in vnesite naslednje:
adder = lambda x, y: x + yprint (adder (1, 2))
Tukaj je rezultat:
3
Razlaga kode
Tu definiramo spremenljivko, ki bo vsebovala rezultat, ki ga vrne lambda funkcija.
1. Ključna beseda lambda, ki se uporablja za definiranje anonimne funkcije.
2. x in y sta parametra, ki ju prenesemo v funkcijo lambda.
3. To je telo funkcije, ki sešteje dva parametra, ki smo jih podali. Opazite, da gre za en izraz. V telo lambda funkcije ne morete zapisati več stavkov.
4. Pokličemo funkcijo in izpišemo vrnjeno vrednost.
2. primer
To je bil osnovni primer za razumevanje osnov in skladnje lambde. Poskusimo zdaj natisniti lambdo in si oglejte rezultat. Še enkrat odprite svoj IDLE in vnesite naslednje:
#What a lambda returnsstring='some kind of a useless lambda'print(lambda string : print(string))
Zdaj shranite datoteko in pritisnite F5, da zaženete program. To je rezultat, ki bi ga morali dobiti.
Izhod:
at 0x00000185C3BF81E0>
Kaj se dogaja tukaj? Poglejmo si kodo, da jo bomo še bolje razumeli.
Razlaga kode
- Tu določimo niz, ki ga boste lambdi predali kot parameter.
- Razglasimo lambdo, ki pokliče izjavo za tiskanje in natisne rezultat.
Zakaj pa program ne natisne niza, ki ga prenesemo? To je zato, ker lambda sama vrne funkcijski objekt. V tem primeru funkcija tiskanja ne prikliče lambde, temveč preprosto vrne funkcijski objekt in mesto pomnilnika, kjer je shranjena. To se natisne na konzoli.
3. primer
Če pa napišete tak program:
#What a lambda returns #2x="some kind of a useless lambda"(lambda x : print(x))(x)
In zaženite ga tako, da pritisnete F5, videli boste takšen izhod.
Izhod:
some kind of a useless lambda
Zdaj se prikliče lambda in niz, ki ga prenesemo, se natisne na konzoli. Kaj pa je ta čudna sintaksa in zakaj je definicija lambda zajeta v oklepajih? Razumimo to zdaj.
Razlaga kode
- Tu je isti niz, ki smo ga definirali v prejšnjem primeru.
- V tem delu definiramo lambdo in jo takoj pokličemo s predajo niza kot argumenta. To se imenuje IIFE, več o tem pa boste izvedeli v naslednjih razdelkih te vadnice.
4. primer
Oglejmo si zadnji primer, da bomo razumeli, kako se izvajajo lambde in običajne funkcije. Torej, odprite svoj IDLE in v novo datoteko vnesite naslednje:
#A REGULAR FUNCTIONdef guru( funct, *args ):funct( *args )def printer_one( arg ):return print (arg)def printer_two( arg ):print(arg)#CALL A REGULAR FUNCTIONguru( printer_one, 'printer 1 REGULAR CALL' )guru( printer_two, 'printer 2 REGULAR CALL \n' )#CALL A REGULAR FUNCTION THRU A LAMBDAguru(lambda: printer_one('printer 1 LAMBDA CALL'))guru(lambda: printer_two('printer 2 LAMBDA CALL'))
Zdaj shranite datoteko in pritisnite F5, da zaženete program. Če se niste zmotili, bi moral biti rezultat približno takšen.
Izhod:
tiskalnik 1 REDEN KLIC
tiskalnik 2 REDEN KLIC
tiskalnik 1 LAMBDA KLIC
tiskalnik 2 LAMBDA KLIC
Razlaga kode
- Funkcija, imenovana guru, ki za prvi parameter vzame drugo funkcijo in vse druge argumente, ki ji sledijo.
- printer_one je preprosta funkcija, ki natisne preneseni parameter in ga vrne.
- printer_two je podoben printer_one, vendar brez izjave o vrnitvi.
- V tem delu pokličemo funkcijo guruja in kot parametre posredujemo funkcije tiskalnika in niz.
- To je sintaksa za doseganje četrtega koraka (tj. Klicanje funkcije guruja), vendar z uporabo lambdas.
V naslednjem razdelku boste izvedeli, kako uporabljati lambda funkcije z map (), reduce () in filter () v Pythonu.
Uporaba lambdas z vgrajenimi Pythoni
Lambda funkcije zagotavljajo eleganten in zmogljiv način za izvajanje operacij z uporabo vgrajenih metod v Pythonu. Možno je, ker lahko lambde takoj prikličete in jih posredujete kot argument za te funkcije.
IIFE v Python Lambda
IIFE pomeni takoj poklicano izvajanje funkcije. To pomeni, da je lambda funkcija vpoklicna takoj, ko je definirana. Razumimo to na primeru; zaženite svoj IDLE in vnesite naslednje:
(lambda x: x + x)(2)
Tu je razlaga izhoda in kode:
Ta sposobnost lambdas, ki jo je mogoče takoj priklicati, vam omogoča uporabo v funkcijah, kot sta map () in reduce (). Koristno je, ker teh funkcij morda ne boste želeli več uporabljati.
lambda v filtru ()
Funkcija filtra se uporablja za izbiro nekaterih določenih elementov iz zaporedja elementov. Zaporedje je lahko kateri koli iterator, kot so seznami, nizi, nabori itd.
Elementi, ki bodo izbrani, temeljijo na nekaterih vnaprej določenih omejitvah. Potrebna sta 2 parametra:
- Funkcija, ki definira omejitev filtriranja
- Zaporedje (kateri koli iterator, kot so seznami, nabori itd.)
Na primer
sequences = [10,2,8,7,5,4,3,11,0, 1]filtered_result = filter (lambda x: x > 4, sequences)print(list(filtered_result))
Tukaj je rezultat:
[10, 8, 7, 5, 11]
Razlaga kode:
1. V prvem stavku določimo seznam zaporedja, ki vsebuje nekaj števil.
2. Tu deklariramo spremenljivko, imenovano filtered_result, ki bo shranila filtrirane vrednosti, ki jih vrne funkcija filter ().
3. Lambda funkcija, ki se zažene na vsakem elementu seznama in vrne true, če je večja od 4.
4. Natisnite rezultat, ki ga vrne funkcija filtra.
lambde na zemljevidu ()
funkcija map se uporablja za uporabo določene operacije za vsak element v zaporedju. Tako kot filter () ima tudi dva parametra:
- Funkcija, ki definira op, ki naj se izvede na elementih
- Eno ali več zaporedij
Tu je na primer program, ki natisne kvadratke števil na danem seznamu:
sequences = [10,2,8,7,5,4,3,11,0, 1]filtered_result = map (lambda x: x*x, sequences)print(list(filtered_result))
Izhod:
[100, 4, 64, 49, 25, 16, 121, 0, 1]
[KR1]
Razlaga kode:
- Tu določimo seznam zaporedja, ki vsebuje nekaj številk.
- Deklariramo spremenljivko, imenovano filtered_result, ki bo shranila preslikane vrednosti
- Lambda funkcija, ki se zažene na vsakem elementu seznama in vrne kvadrat te številke.
- Natisnite rezultat, ki ga vrne funkcija zemljevida.
lambda v znižanju ()
Funkcija redukcije, kot je map (), se uporablja za uporabo operacije za vsak element v zaporedju. Vendar se od zemljevida razlikuje po svojem delovanju. To so koraki, ki jim sledi funkcija reduce () za izračun izhoda:
Korak 1) Izvedite določeno operacijo na prvih dveh elementih zaporedja.
Korak 2) Shranite ta rezultat
Korak 3) Izvedite postopek s shranjenim rezultatom in naslednjim elementom v zaporedju.
4. korak) Ponavljajte, dokler ne ostane več elementov.
Zajema tudi dva parametra:
- Funkcija, ki definira operacijo, ki jo je treba izvesti
- Zaporedje (kateri koli iterator, kot so seznami, nabori itd.)
Tu je na primer program, ki vrne zmnožek vseh elementov na seznamu:
from functools import reducesequences = [1,2,3,4,5]product = reduce (lambda x, y: x*y, sequences)print(product)
Tukaj je rezultat:
120
Razlaga kode:
- Uvoz reduciraj iz modula functools
- Tu določimo seznam zaporedja, ki vsebuje nekaj številk.
- Razglasimo spremenljivko, imenovano izdelek, ki bo shranila zmanjšano vrednost
- Lambda funkcija, ki se izvaja na vsakem elementu seznama. Vrnil bo zmnožek te številke po prejšnjem rezultatu.
- Natisnite rezultat, ki ga vrne funkcija zmanjšanja.
Zakaj (in zakaj ne) uporabljati lambda funkcije?
Kot boste videli v naslednjem poglavju, so lambde obravnavane enako kot običajne funkcije na ravni tolmača. Na nek način bi lahko rekli, da lambde zagotavljajo kompaktno sintakso za zapisovanje funkcij, ki vrnejo en izraz.
Vedeti pa morate, kdaj je dobro uporabljati lambde in kdaj se jim izogibati. V tem poglavju boste spoznali nekatera načela oblikovanja, ki jih uporabljajo razvijalci pythona pri pisanju lambdas.
Eden najpogostejših primerov uporabe lambdas je v funkcionalnem programiranju, saj Python podpira paradigmo (ali slog) programiranja, znano kot funkcionalno programiranje.
Omogoča, da funkciji kot parameter zagotovite drugo funkcijo (na primer na zemljevidu, filtru itd.). V takih primerih uporaba lambdas ponuja eleganten način za ustvarjanje enkratne funkcije in njeno posredovanje kot parameter.
Kdaj ne smete uporabljati Lambde?
Nikoli ne bi smeli pisati zapletenih lambda funkcij v produkcijskem okolju. Šifranti, ki vzdržujejo vašo kodo, jo bodo zelo težko dešifrirali. Če se znajdete v zapletenih enovrstnih izrazih, bi bila veliko boljša praksa, da definirate pravilno funkcijo. Kot najboljšo prakso si morate zapomniti, da je preprosta koda vedno boljša od zapletene kode.
Lambda proti običajnim funkcijam
Kot smo že omenili, so lambde [vV4] [J5] samo funkcije, ki nimajo nanje vezanega identifikatorja. Z enostavnejšimi besedami gre za funkcije brez imen (torej anonimne). Tu je tabela, ki ponazarja razliko med lambdami in običajnimi funkcijami v pythonu.
Lambde
Redne funkcije
Sintaksa:
lambda x : x + x
Sintaksa:
def (x) :return x + x
Lambda funkcije imajo lahko v telesu samo en izraz.
Regularne funkcije imajo lahko v telesu več izrazov in stavkov.
Lambde nimajo imena, povezanega z njimi. Zato so znane tudi kot anonimne funkcije.
Redne funkcije morajo imeti ime in podpis.
Lambde ne vsebujejo izjave o vrnitvi, ker se telo samodejno vrne.
Funkcije, ki morajo vrniti vrednost, morajo vključevati stavek return.
Pojasnilo razlik?
Primarna razlika med lambda in navadno funkcijo je, da lambda funkcija ovrednoti samo en izraz in daje funkcijski objekt. Posledično lahko imenujemo rezultat funkcije lambda in ga uporabimo v našem programu, kot smo to storili v prejšnjem primeru.
Običajna funkcija za zgornji primer bi izgledala takole:
def adder (x, y):return x + yprint (adder (1, 2))
Tu moramo definirati ime funkcije, ki vrne rezultat, ko ga pokličemo . Lambda funkcija ne vsebuje stavka return, ker bo imela samo en izraz, ki se vedno privzeto vrne. Niti lambde vam ni treba dodeliti, saj jo je mogoče takoj priklicati (glejte naslednji razdelek). Kot boste videli v naslednjem primeru, postanejo lambde še posebej zmogljive, ko jih uporabljamo z vgrajenimi funkcijami Pythona.
Vendar se morda še vedno sprašujete, kako se lambde razlikujejo od funkcije, ki vrne en sam izraz (kot je zgornji). Na ravni tolmača ni veliko razlik. Morda se sliši presenetljivo, toda tolmač katero koli lambda funkcijo, ki jo določite v Pythonu, obravnava kot običajno funkcijo.
Kot lahko vidite na diagramu, interpreter python pri pretvorbi v bajt kodo na enak način obravnava obe definiciji. Zdaj funkcije lambda ne morete poimenovati, ker jo je Python rezerviral, toda katero koli drugo ime funkcije bo dalo isto bajtno kodo [KR6].
Povzetek
- Lambde, znane tudi kot anonimne funkcije, so majhne, omejene funkcije, ki ne potrebujejo imena (tj. Identifikatorja).
- Vsaka lambda funkcija v Pythonu ima 3 bistvene dele:
- Ključna beseda lambda.
- Parametri (ali vezane spremenljivke) in
- Telo funkcije.
- Sintaksa za pisanje lambda je: lambda parameter: izraz
- Lambde imajo lahko poljubno število parametrov, vendar niso v oklepajih
- Lambda ima lahko v telesu funkcije samo 1 izraz, ki se privzeto vrne.
- Na ravni bytecode ni velike razlike med tem, kako tolmač ravna z lambdami in običajnimi funkcijami.
- Lambda podpira IIFE skozi to sintakso: (lambda parameter: izraz) (argument)
- Lambde se pogosto uporabljajo z naslednjimi vgrajenimi pythoni:
- Filter: filter (lambda parameter: izraz, iterabilno zaporedje)
- Zemljevid: zemljevid (lambda parameter: izraz, iterabilna zaporedja)
- Zmanjšaj: zmanjšaj (lambda parameter1, parameter2: izraz, iterable-zaporedje)
- Ne pišite zapletenih lambda funkcij v produkcijskem okolju, ker bodo vzdrževalci kode težko.
[J5] Dodal sem tabelo, vendar je za razumevanje razlik potrebna razlaga.