Python Lambda funkciók példákkal
Miben található a lambda funkció? Python?
A Lambda funkció be Python A programozás névtelen vagy névtelen függvény. Ez egy kicsi és korlátozott függvény, amelynek legfeljebb egy sora van. Csakúgy, mint egy normál függvénynek, a Lambda függvénynek több argumentuma is lehet egyetlen kifejezéssel.
In Python, a lambda-kifejezések (vagy lambda-formák) névtelen függvények létrehozására szolgálnak. Ehhez használja a lambda kulcsszó (ahogyan használod def normál függvények meghatározásához). Minden névtelen függvény, amelyben definiálsz Python 3 alapvető része lesz:
- A lambda kulcsszó.
- A paraméterek (vagy kötött változók), és
- A funkciótest.
Egy lambda függvénynek tetszőleges számú paramétere lehet, de a függvénytörzs csak tartalmazhat egy kifejezés. Ezenkívül a lambda egyetlen kódsorba van írva, és azonnal meghívható. Mindezt működés közben láthatja a következő példákban.
Szintaxis és példák
A lambda függvény írásának formális szintaxisa a következő:
lambda p1, p2: expression
Itt p1 és p2 a lambda függvénynek átadott paraméterek. Annyi vagy kevés paramétert adhat hozzá, amennyire szüksége van.
Figyeljük meg azonban, hogy nem használunk zárójeleket a paraméterek körül, mint a normál függvényeknél. Az utolsó rész (kifejezés) bármely érvényes python kifejezés, amely a függvénynek megadott paraméterekkel működik.
Példa 1
Most, hogy ismeri a lambdákat, próbáljuk meg egy példával. Szóval nyisd ki a te IDLE és írja be a következőket:
adder = lambda x, y: x + y print (adder (1, 2))
Itt van a kimenet:
3
Kód Magyarázat
Itt definiálunk egy változót, amely tartalmazza a lambda függvény által visszaadott eredményt.
1. A lambda kulcsszó egy névtelen függvény meghatározására szolgál.
2. x és y azok a paraméterek, amelyeket átadunk a lambda függvénynek.
3. Ez a függvény törzse, amely hozzáadja az általunk átadott 2 paramétert. Figyeljük meg, hogy ez egyetlen kifejezés. Egy lambda-függvény törzsébe nem írhat több utasítást.
4. Meghívjuk a függvényt és kiírjuk a visszaadott értéket.
Példa 2
Ez egy alapvető példa volt a lambda alapjainak és szintaxisának megértéséhez. Most próbáljunk kinyomtatni egy lambdát, és meglátjuk az eredményt. Ismét nyissa ki a sajátját IDLE és írja be a következőket:
#What a lambda returns string='some kind of a useless lambda' print(lambda string : print(string))
Most mentse el a fájlt, és nyomja meg az F5 billentyűt a program futtatásához. Ez az a kimenet, amelyet meg kell kapnia.
output:
<function <lambda> at 0x00000185C3BF81E0>
Mi történik itt? Nézzük meg a kódot, hogy jobban megértsük.
Kód Magyarázat
- Itt definiáljuk a húr amit paraméterként át fog adni a lambdának.
- Deklarálunk egy lambdát, amely meghív egy print utasítást és kiírja az eredményt.
De miért nem írja ki a program az általunk átadott karakterláncot? Ennek az az oka, hogy maga a lambda egy függvényobjektumot ad vissza. Ebben a példában a lambda nem lét hívott a nyomtatási funkcióval, hanem egyszerűen visszatérő a függvényobjektum és a memóriahely, ahol tárolják. Ezt nyomtatják ki a konzolon.
Példa 3
Ha azonban írsz egy ilyen programot:
#What a lambda returns #2 x="some kind of a useless lambda" (lambda x : print(x))(x)
És futtassa az F5 megnyomásával, ekkor egy ilyen kimenetet fog látni.
output:
some kind of a useless lambda
Most a lambdát hívják, és az általunk átadott karakterlánc kinyomtatja a konzolt. De mi ez a furcsa szintaxis, és miért van a lambda definíció zárójelben? Ezt most értsük meg.
Kód Magyarázat
- Itt ugyanaz a karakterlánc, amelyet az előző példában definiáltunk.
- Ebben a részben definiáljuk a lambdát, és azonnal meghívjuk a karakterlánc argumentumként való átadásával. Ezt IIFE-nek hívják, és többet megtudhat róla ennek az oktatóanyagnak a következő szakaszaiban.
Példa 4
Nézzünk meg egy utolsó példát, hogy megértsük, hogyan hajtódnak végre a lambda- és a reguláris függvények. Szóval nyisd ki a te IDLE és egy új fájlba írja be a következőket:
#A REGULAR FUNCTION
def guru( funct, *args ):
funct( *args )
def printer_one( arg ):
return print (arg)
def printer_two( arg ):
print(arg)
#CALL A REGULAR FUNCTION
guru( printer_one, 'printer 1 REGULAR CALL' )
guru( printer_two, 'printer 2 REGULAR CALL \n' )
#CALL A REGULAR FUNCTION THRU A LAMBDA
guru(lambda: printer_one('printer 1 LAMBDA CALL'))
guru(lambda: printer_two('printer 2 LAMBDA CALL'))
Most mentse el a fájlt, és nyomja meg az F5 billentyűt a program futtatásához. Ha nem hibázott, a kimenetnek valami ilyesminek kell lennie.
output:
printer 1 REGULAR CALL printer 2 REGULAR CALL printer 1 LAMBDA CALL printer 2 LAMBDA CALL
Kód Magyarázat
- Egy guru nevű függvény, amely egy másik függvényt vesz fel első paraméterként, és az azt követő összes többi argumentumot.
- A printer_one egy egyszerű függvény, amely kiírja a neki átadott paramétert, és visszaadja azt.
- nyomtató_kettő hasonló a nyomtató_egyhez, de a return utasítás nélkül.
- Ebben a részben a guru függvényt hívjuk meg, és paraméterként adjuk át a nyomtató függvényeket és egy karakterláncot.
- Ez a szintaxis a negyedik lépés eléréséhez (azaz a guru függvény meghívásához), de lambdas használatával.
A következő részben megtudhatja, hogyan használhatja a lambda függvényeket térkép(), csökkenti(), és a szűrő() in Python.
Lambda használata a Python beépítettek
A lambda-funkciók elegáns és hatékony módot biztosítanak a műveletek végrehajtására a beépített módszerekkel Python. Ez azért lehetséges, mert a lambdákat azonnal meg lehet hívni, és argumentumként át lehet adni ezeknek a függvényeknek.
IIFE be Python Lambda
IIFE jelentése azonnal meghívja a függvény végrehajtását. Ez azt jelenti, hogy egy lambda függvény hívható, amint meghatározásra került. Értsük meg ezt egy példával; gyújtsd fel a tiédet IDLE és írja be a következőket:
(lambda x: x + x)(2)
Íme a kimenet és a kód magyarázata:
A lambdák ezen azonnali meghívásának képessége lehetővé teszi, hogy olyan függvényekben használhasd őket, mint a map() és a reduction(). Hasznos, mert előfordulhat, hogy nem kívánja újra használni ezeket a funkciókat.
lambdas a szűrőben ()
A szűrő funkció bizonyos elemek kiválasztására szolgál egy elemsorozatból. A sorozat lehet bármilyen iterátor, például listák, halmazok, sorok stb.
A kiválasztandó elemek valamilyen előre meghatározott megszorításon alapulnak. 2 paraméter kell hozzá:
- Egy függvény, amely meghatározza a szűrési kényszert
- Egy sorozat (bármilyen iterátor, például listák, sorok stb.)
Például,
sequences = [10,2,8,7,5,4,3,11,0, 1] filtered_result = filter (lambda x: x > 4, sequences) print(list(filtered_result))
Itt van a kimenet:
[10, 8, 7, 5, 11]
Kód magyarázata:
1. Az első utasításban definiálunk egy listát, amelyet sorozatoknak nevezünk, és amely néhány számot tartalmaz.
2. Itt deklarálunk egy filtered_result nevű változót, amely a filter() függvény által visszaadott szűrt értékeket tárolja.
3. Egy lambda függvény, amely a lista minden elemén fut, és igazat ad vissza, ha nagyobb, mint 4.
4. Nyomtassa ki a szűrőfüggvény által visszaadott eredményt.
lambdák a térképen()
a leképezés funkciót arra használják, hogy egy adott műveletet alkalmazzanak egy sorozat minden elemére. A filter()-hez hasonlóan ez is 2 paramétert igényel:
- Egy függvény, amely meghatározza az elemeken végrehajtandó műveletet
- Egy vagy több sorozat
Például itt van egy program, amely kiírja a számok négyzeteit egy adott listában:
sequences = [10,2,8,7,5,4,3,11,0, 1] filtered_result = map (lambda x: x*x, sequences) print(list(filtered_result))
output:
[100, 4, 64, 49, 25, 16, 9, 121, 0, 1]
[KR1]
Kód magyarázata:
- Itt definiálunk egy listát, amelyet sorozatoknak nevezünk, és amely néhány számot tartalmaz.
- Deklarálunk egy filtered_result nevű változót, amely tárolja a leképezett értékeket
- Egy lambda függvény, amely a lista minden elemén lefut, és a szám négyzetét adja vissza.
- Nyomtassa ki a térkép funkció által visszaadott eredményt.
lambdas a redukcióban ()
A redukciós függvény, mint például a map(), arra szolgál, hogy egy műveletet alkalmazzon a sorozat minden elemére. Működésében azonban eltér a térképtől. Ezeket a lépéseket követi a redukció() függvény a kimenet kiszámításához:
Step 1) Hajtsa végre a meghatározott műveletet a sorozat első 2 elemén.
Step 2) Mentse el ezt az eredményt
Step 3) Hajtsa végre a műveletet a mentett eredménnyel és a sorozat következő elemével.
Step 4) Addig ismételje, amíg nem marad több elem.
Ehhez két paraméter is szükséges:
- A végrehajtandó műveletet meghatározó függvény
- Egy sorozat (bármilyen iterátor, például listák, sorok stb.)
Például itt van egy program, amely egy lista összes elemének szorzatát adja vissza:
from functools import reduce sequences = [1,2,3,4,5] product = reduce (lambda x, y: x*y, sequences) print(product)
Itt van a kimenet:
120
Kód magyarázata:
- A csökkentés importálása a functools modulból
- Itt definiálunk egy listát, amelyet sorozatoknak nevezünk, és amely néhány számot tartalmaz.
- Deklarálunk egy termék nevű változót, amely a csökkentett értéket tárolja
- Egy lambda függvény, amely a lista minden elemén fut. Ennek a számnak a szorzatát adja vissza az előző eredmény szerint.
- Nyomtassa ki a redukciós függvény által visszaadott eredményt.
Miért (és miért ne) használjunk lambda függvényeket?
Amint a következő részben látni fogja, a lambdákat ugyanúgy kezeljük, mint a normál függvényeket tolmács szinten. Bizonyos értelemben azt is mondhatnánk, hogy a lambdas tömör szintaxist biztosít olyan függvények írásához, amelyek egyetlen kifejezést adnak vissza.
Azonban tudnia kell, mikor érdemes lambdákat használni, és mikor kerülni őket. Ebben a részben megtudhat néhány tervezési alapelvet, amelyet a python fejlesztők alkalmaznak a lambdák írásakor.
A lambdák egyik leggyakoribb felhasználási esete a funkcionális programozás Python támogatja a funkcionális programozásnak nevezett programozási paradigmát (vagy stílust).
Lehetővé teszi egy függvény megadását egy másik függvény paramétereként (például térképben, szűrőben stb.). Ilyen esetekben a lambda használata elegáns módot kínál egy egyszeri függvény létrehozására és paraméterként való átadására.
Mikor nem szabad Lambdát használni?
Soha ne írjon bonyolult lambda függvényeket éles környezetben. A kódot karbantartó kódolók számára nagyon nehéz lesz visszafejteni azt. Ha azon kapod magad, hogy összetett egysoros kifejezéseket készítesz, sokkal jobb gyakorlat lenne egy megfelelő függvény meghatározása. A legjobb gyakorlat szerint emlékeznie kell arra, hogy az egyszerű kód mindig jobb, mint az összetett kód.
Lambdák vs. reguláris függvények
Amint azt korábban említettük, a lambdák [vV4][J5] csak olyan függvények, amelyekhez nincs azonosító kötve. Egyszerűbb szavakkal, ezek név nélküli (tehát névtelen) függvények. Itt van egy táblázat, amely bemutatja a különbséget a lambda és a python normál függvényei között.
Lambdák
Rendszeres funkciók
Syntax:
lambda x : x + x
Syntax:
def (x) : return x + x
A lambda-funkcióknak csak egy kifejezése lehet a testükben.
A reguláris függvények törzsében több kifejezés és kijelentés is lehet.
A lambdákhoz nincs név társítva. Ezért névtelen függvényeknek is nevezik őket.
A normál függvényeknek névvel és aláírással kell rendelkezniük.
A lambdák nem tartalmaznak return utasítást, mert a törzs automatikusan visszaadásra kerül.
Azoknak a függvényeknek, amelyeknek értéket kell visszaadniuk, tartalmazniuk kell egy return utasítást.
A különbségek magyarázata?
Az elsődleges különbség a lambda és a reguláris függvény között az, hogy a lambda függvény csak egyetlen kifejezést értékel, és egy függvényobjektumot eredményez. Következésképpen a lambda függvény eredményét elnevezhetjük és felhasználhatjuk programunkban, ahogy az előző példában tettük.
A fenti példa szokásos függvénye így néz ki:
def adder (x, y): return x + y print (adder (1, 2))
Itt meg kell határoznunk a név a funkcióhoz, amely Visszatér az eredmény, amikor mi hívás azt. A lambda függvény nem tartalmaz return utasítást, mert csak egyetlen kifejezést tartalmaz, amelyet alapértelmezés szerint mindig visszaad. Még csak lambdát sem kell hozzárendelnie, mert azonnal meghívható (lásd a következő részt). Amint azt a következő példában látni fogja, a lambdák különösen erőssé válnak, ha együtt használjuk őket Pythonbeépített funkcióit.
Mindazonáltal továbbra is felmerülhet a kérdés, hogy miben különbözik a lambda egy olyan függvénytől, amely egyetlen kifejezést ad vissza (mint a fenti). Tolmács szinten nincs sok különbség. Lehet, hogy meglepően hangzik, de bármelyik lambda függvény, amiben definiálsz Python a tolmács normál funkcióként kezeli.
Amint az ábrán látható, a két definíciót ugyanúgy kezeli a python interpreter, amikor bájtkódra konvertálja őket. Most nem nevezhet el függvényt lambda mert le van foglalva Python, de bármely más függvénynév ugyanazt a bájtkódot adja [KR6].
Összegzésként
- A lambdák, más néven anonim függvények, kicsi, korlátozott függvények, amelyeknek nincs szükségük névre (azaz azonosítóra).
- Minden lambda funkció be van kapcsolva Python 3 alapvető részből áll:
- A lambda kulcsszó.
- A paraméterek (vagy kötött változók), és
- A funkciótest.
- A lambda írásának szintaxisa: lambda paraméter: kifejezés
- A lambdáknak tetszőleges számú paramétere lehet, de nincsenek kapcsos zárójelek közé zárva
- A lambda függvény törzsében csak 1 kifejezés szerepelhet, amelyet alapértelmezés szerint ad vissza.
- A bájtkód szintjén nincs sok különbség a között, hogy a lambda és a normál függvényeket hogyan kezeli az értelmező.
- A lambda támogatja az IIFE-t a következő szintaxissal: (lambda paraméter: kifejezés) (argumentum)
- A lambdákat általában a következő python beépített elemekkel használják:
- Szűrő: szűrő (lambda paraméter: kifejezés, iterálható sorozat)
- Térkép: térkép (lambda paraméter: kifejezés, iterálható sorozatok)
- Kicsinyítés: redukálás (lambda paraméter1, paraméter2: kifejezés, iterálható sorozat)
- Ne írjon bonyolult lambda függvényeket éles környezetben, mert ez nehéz lesz a kódkarbantartóknak.
[J5]Hozzáadtam egy táblázatot, de a magyarázat szükséges a különbségek megértéséhez.
