Python Lambda funkcije s PRIMJERIMA
โก Pametni saลพetak
Lambda funkcije u Python su male anonimne funkcije definirane kljuฤnom rijeฤi lambda umjesto def. One sadrลพe jedan izraz, prihvaฤaju bilo koji broj argumenata i ฤesto se izravno prosljeฤuju ugraฤenim funkcijama kao ลกto su map(), filter() i sorted().

U ฤemu je Lambda funkcija Python?
A Lambda funkcija u Python programiranje je anonimna funkcija ili funkcija bez imena. To je mala i ograniฤena funkcija koja nema viลกe od jednog retka. Kao i normalna funkcija, Lambda funkcija moลพe imati viลกe argumenata s jednim izrazom.
In Python, lambda izrazi (ili lambda oblici) koriste se za konstrukciju anonimnih funkcija. Da biste to uฤinili, upotrijebit ฤete ร kljuฤna rijeฤ (baลก kao ลกto koristite def za definiranje normalnih funkcija). Svaka anonimna funkcija koju definirate u Python imat ฤe 3 bitna dijela:
- Kljuฤna rijeฤ lambda.
- Parametri (ili vezane varijable) i
- Tijelo funkcije.
Lambda funkcija moลพe imati bilo koji broj parametara, ali tijelo funkcije moลพe sadrลพavati samo jedan izraz. ล toviลกe, lambda je napisana u jednoj liniji koda i takoฤer se moลพe odmah pozvati. Sve ฤete to vidjeti na djelu u sljedeฤim primjerima.
Sintaksa i primjeri
Formalna sintaksa za pisanje lambda funkcije je navedena u nastavku:
lambda p1, p2: expression
Ovdje su p1 i p2 parametri koji se prosljeฤuju lambda funkciji. Moลพete dodati onoliko ili manje parametara koliko vam je potrebno.
Meฤutim, primijetite da ne koristimo zagrade oko parametara kao ลกto to ฤinimo s regularnim funkcijama. Posljednji dio (izraz) je bilo koji valjani Python izraz koji operira na parametrima koje navedete funkciji.
Primjer 1
Sad kad znate o lambdama, pokuลกajmo to na primjeru. Dakle, otvorite svoje IDLE i upiลกite sljedeฤe:
adder = lambda x, y: x + y print (adder (1, 2))
Code Objaลกnjenje
Ovdje definiramo varijablu koja ฤe sadrลพavati rezultat koji vraฤa lambda funkcija.
1. Kljuฤna rijeฤ lambda koja se koristi za definiranje anonimne funkcije.
2. x i y su parametri koje prosljeฤujemo lambda funkciji.
3. Ovo je tijelo funkcije koja dodaje 2 parametra koja smo proslijedili. Primijetite da je to jedan izraz. Ne moลพete napisati viลกe izjava u tijelu lambda funkcije.
4. Pozivamo funkciju i ispisujemo vraฤenu vrijednost.
Primjer 2
To je bio osnovni primjer za razumijevanje osnova i sintakse lambde. Pokuลกajmo sada ispisati lambdu i vidjeti rezultat. Ponovno, otvorite svoj IDLE i upiลกite sljedeฤe:
#What a lambda returns string='some kind of a useless lambda' print(lambda string : print(string))
Sada spremite datoteku i pritisnite F5 za pokretanje programa. Ovo je rezultat koji biste trebali dobiti.
Izlaz:
<function <lambda> at 0x00000185C3BF81E0>
ล to se ovdje dogaฤa? Pogledajmo kod kako bismo bolje razumjeli.
Code Objaลกnjenje:
1. Ovdje definiramo niz koji ฤete proslijediti kao parametar lambdi.
2. Deklariramo lambdu koja poziva naredbu print i ispisuje rezultat.
Ali zaลกto program ne ispisuje niz koji prosljeฤujemo? To je zato ลกto sama lambda vraฤa funkcijski objekt. U ovom primjeru, lambda se ne ispisuje zvan pomoฤu funkcije ispisa, veฤ je jednostavno povratka objekt funkcije i memorijska lokacija u kojoj je pohranjen. To se ispisuje na konzoli.
Primjer 3
Meฤutim, ako napiลกete ovakav program:
#What a lambda returns #2 x="some kind of a useless lambda" (lambda x : print(x))(x)
I pokrenite ga pritiskom na F5, vidjet ฤete ovakav izlaz.
Izlaz:
some kind of a useless lambda
Sada se poziva lambda, a niz koji prosljeฤujemo ispisuje se u konzoli. Ali ลกto je ta ฤudna sintaksa i zaลกto je definicija lambde zatvorena u zagrade? Razumijemo to sada.
Code Objaลกnjenje:
1. Ovdje je isti niz znakova koji smo definirali u prethodnom primjeru.
2. U ovom dijelu definiramo lambdu i odmah je pozivamo prosljeฤivanjem niza znakova kao argumenta. To se naziva IIFE, a viลกe o tome saznat ฤete u sljedeฤim odjeljcima ovog tutoriala.
Primjer 4
Pogledajmo posljednji primjer kako bismo razumjeli kako se izvrลกavaju lambda i regularne funkcije. Dakle, otvorite svoj IDLE i u novu datoteku upiลกite sljedeฤe:
#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'))
Sada spremite datoteku i pritisnite F5 za pokretanje programa. Ako niste napravili nikakve pogreลกke, izlaz bi trebao biti neลกto poput ovoga.
Izlaz:
printer 1 REGULAR CALL printer 2 REGULAR CALL printer 1 LAMBDA CALL printer 2 LAMBDA CALL
Code Objaลกnjenje:
1. Funkcija pod nazivom guru koja uzima drugu funkciju kao prvi parametar i sve ostale argumente koji slijede nakon nje.
2. printer_one je jednostavna funkcija koja ispisuje proslijeฤeni parametar i vraฤa ga.
3. printer_two je sliฤan printer_one, ali bez naredbe return.
4. U ovom dijelu pozivamo funkciju guru i prosljeฤujemo funkcije pisaฤa i niz znakova kao parametre.
5. Ovo je sintaksa za postizanje ฤetvrtog koraka (tj. pozivanje funkcije guru), ali koriลกtenjem lambda.
U sljedeฤem odjeljku nauฤit ฤete kako koristiti lambda funkcije sa karta(), smanjiti()i filtar() in Python.
Koriลกtenje lambda sa Python ugraฤeni
Lambda funkcije pruลพaju elegantan i moฤan naฤin za izvoฤenje operacija pomoฤu ugraฤenih metoda Python. To je moguฤe jer se lambde mogu odmah pozvati i proslijediti kao argument tim funkcijama.
IIFE u Python Lambda
IIFE zalaลพe za odmah pozvano izvrลกenje funkcije. To znaฤi da se lambda funkcija moลพe pozvati ฤim se definira. Razumijemo to na primjeru; pokrenite svoj IDLE i upiลกite sljedeฤe:
(lambda x: x + x)(2)
Evo izlaza i objaลกnjenja koda:
Ova sposobnost lambda da se odmah pozove omoguฤuje vam da ih koristite unutar funkcija kao ลกto su map() i reduce(). Korisno je jer moลพda viลกe neฤete htjeti koristiti ove funkcije.
lambda u filtru()
Funkcija filtra koristi se za odabir odreฤenih elemenata iz niza elemenata. Niz moลพe biti bilo koji iterator poput popisa, skupova, torki itd.
Elementi koji ฤe biti odabrani temelje se na nekom unaprijed definiranom ograniฤenju. Potrebna su 2 parametra:
- Funkcija koja definira ograniฤenje filtriranja
- Niz (bilo koji iterator poput popisa, torki itd.)
Na primjer,
sequences = [10,2,8,7,5,4,3,11,0, 1] filtered_result = filter (lambda x: x > 4, sequences) print(list(filtered_result))
Evo rezultata:
[10, 8, 7, 5, 11]
Code Objaลกnjenje:
1. U prvoj izjavi definiramo popis nazvan sekvence koji sadrลพi neke brojeve.
2. Ovdje deklariramo varijablu pod nazivom filtered_result, koja ฤe pohraniti filtrirane vrijednosti koje vraฤa funkcija filter().
3. Lambda funkcija koja se pokreฤe na svakom elementu popisa i vraฤa true ako je veฤi od 4.
4. Ispiลกite rezultat koji je vratila funkcija filtera.
lambda u mapi()
Funkcija map se koristi za primjenu odreฤene operacije na svaki element u nizu. Poput filter(), takoฤer uzima 2 parametra:
- Funkcija koja definira operaciju koja se izvodi na elementima
- Jedna ili viลกe sekvenci
Na primjer, ovdje je program koji ispisuje kvadrate brojeva na danom popisu:
sequences = [10,2,8,7,5,4,3,11,0, 1] filtered_result = map (lambda x: x*x, sequences) print(list(filtered_result))
Izlaz:
[100, 4, 64, 49, 25, 16, 9, 121, 0, 1]
Code Objaลกnjenje:
1. Ovdje definiramo popis nazvan nizovi koji sadrลพe neke brojeve.
2. Deklariramo varijablu pod nazivom filtered_result koja ฤe pohranjivati โโmapirane vrijednosti.
3. Lambda funkcija koja se izvrลกava na svakom elementu liste i vraฤa kvadrat tog broja.
4. Ispiลกite rezultat koji je vratila funkcija map.
lambda u redukciji()
Funkcija reduciranja, poput map(), koristi se za primjenu operacije na svaki element u nizu. Meฤutim, razlikuje se od karte u svom radu. Ovo su koraci nakon kojih slijedi funkcija reduce() za izraฤunavanje izlaza:
Korak 1) Izvedite definiranu operaciju na prva 2 elementa niza.
Korak 2) Spremi ovaj rezultat.
Korak 3) Izvedite operaciju sa spremljenim rezultatom i sljedeฤim elementom u nizu.
Korak 4) Ponavljajte dok viลกe ne ostane nijedan element.
Takoฤer su potrebna dva parametra:
- Funkcija koja definira operaciju koju treba izvesti
- Niz (bilo koji iterator poput popisa, torki itd.)
Na primjer, ovdje je program koji vraฤa umnoลพak svih elemenata na popisu:
from functools import reduce sequences = [1,2,3,4,5] product = reduce (lambda x, y: x*y, sequences) print(product)
Evo rezultata:
120
Code Objaลกnjenje:
1. Uvezite reduce iz modula functools.
2. Ovdje definiramo popis nazvan nizovi koji sadrลพe neke brojeve.
3. Deklariramo varijablu pod nazivom product koja ฤe pohraniti reduciranu vrijednost.
4. Lambda funkcija koja se izvrลกava na svakom elementu popisa. Vratit ฤe umnoลพak tog broja prema prethodnom rezultatu.
5. Ispiลกite rezultat koji je vratila funkcija reduce.
Zaลกto (i zaลกto ne) koristiti lambda funkcije?
Kao ลกto ฤete vidjeti u sljedeฤem odjeljku, lambda se tretiraju isto kao i regularne funkcije na razini tumaฤa. Na neki naฤin, moglo bi se reฤi da lambda pruลพa kompaktnu sintaksu za pisanje funkcija koje vraฤaju jedan izraz.
Meฤutim, trebali biste znati kada je dobra ideja koristiti lambde, a kada ih izbjegavati. U ovom odjeljku nauฤit ฤete neke od principa dizajna koje koriste Python programeri prilikom pisanja lambda funkcija.
Jedan od najฤeลกฤih sluฤajeva upotrebe lambda izraza je u funkcionalnom programiranju, kao ลกto je Python podrลพava paradigmu (ili stil) programiranja poznatu kao funkcionalno programiranje.
Omoguฤuje vam da funkciju navedete kao parametar drugoj funkciji (na primjer, u mapi, filteru itd.). U takvim sluฤajevima, koriลกtenje lambda izraza nudi elegantan naฤin stvaranja jednokratne funkcije i njenog prosljeฤivanja kao parametra.
Kada ne smijete koristiti Lambdu?
Nikada ne biste trebali pisati komplicirane lambda funkcije u proizvodnom okruลพenju. Koderima koji odrลพavaju vaลก kod bit ฤe vrlo teลกko deลกifrirati ga. Ako se naฤete u izradi sloลพenih izraza u jednom retku, bila bi bolja praksa definirati ispravnu funkciju. Kao najbolju praksu, trebate zapamtiti da je jednostavan kod uvijek bolji od sloลพenog koda.
Lambda vs. regularne funkcije
Kao ลกto je prethodno navedeno, lambde su samo funkcije koje nemaju vezan identifikator. Jednostavnije reฤeno, to su funkcije bez imena (dakle, anonimne). Evo tablice koja ilustrira razliku izmeฤu lambdi i regularnih funkcija u Python.
| Lambde | Redovne funkcije |
|---|---|
Sintaksa:
lambda x : x + x
|
Sintaksa:
def (x) : return x + x |
| Lambda funkcije mogu imati samo jedan izraz u svom tijelu. | Regularne funkcije mogu imati viลกe izraza i izjava u svom tijelu. |
| Lambde nemaju ime. Zato su poznate i kao anonimne funkcije. | Redovne funkcije moraju imati ime i potpis. |
| Lambda ne sadrลพi naredbu return jer se tijelo automatski vraฤa. | Funkcije koje trebaju vratiti vrijednost trebaju ukljuฤivati โโnaredbu return. |
Objaลกnjenje razlika
Primarna razlika izmeฤu lambda i obiฤne funkcije je u tome ลกto lambda funkcija vrednuje samo jedan izraz i daje funkcijski objekt. Posljediฤno, moลพemo imenovati rezultat lambda funkcije i koristiti ga u naลกem programu kao ลกto smo uฤinili u prethodnom primjeru.
Redovna funkcija za gornji primjer izgledala bi ovako:
def adder (x, y): return x + y print (adder (1, 2))
Ovdje moramo definirati a ime za funkciju koja vraฤa rezultat kada mi poziv Lambda funkcija ne sadrลพi naredbu return jer ฤe imati samo jedan izraz koji se uvijek vraฤa prema zadanim postavkama. Ne morate ฤak ni dodijeliti lambdu, jer se ona moลพe odmah pozvati (vidi prethodni odjeljak). Kao ลกto ฤete vidjeti, lambde postaju posebno moฤne kada ih koristimo s Pythonugraฤene funkcije.
Meฤutim, moลพda se i dalje pitate po ฤemu se lambda razlikuje od funkcije koja vraฤa jedan izraz (poput onog iznad). Na razini tumaฤa nema velike razlike. Moลพda zvuฤi iznenaฤujuฤe, ali svaka lambda funkcija koju definirate u Python interpretator tretira kao normalnu funkciju.
Na razini bajtkoda, dvije definicije se obraฤuju na isti naฤin od strane Python interpreter. Sada ne moลพete imenovati funkciju ร jer je rezerviran od strane Python, ali bilo koje drugo ime funkcije dat ฤe isti bajtkod.
