Python Lambda funkcije s PRIMJERIMA
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 radimo s uobiฤajenim funkcijama. Zadnji dio (izraz) je bilo koji vaลพeฤi python izraz koji radi na parametrima koje ste dali 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))
Evo rezultata:
3
Objaลกnjenje koda
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 lambda. Pokuลกajmo sada ispisati lambda i vidjeti rezultat. Opet, otvorite svoje 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 za daljnje razumijevanje.
Objaลกnjenje koda
- Ovdje definiramo a niz koju ฤete proslijediti kao parametar lambdi.
- Deklariramo lambda koja poziva naredbu za ispis 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 nije postojanje zvan funkcijom ispisa ali jednostavno povratka funkcijski objekt i memorijsku lokaciju na kojoj je pohranjen. To je ono ลก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 na konzoli. Ali kakva je to ฤudna sintaksa i zaลกto je lambda definicija prekrivena zagradama? Shvatimo to sada.
Objaลกnjenje koda
- Ovdje je isti niz koji smo definirali u prethodnom primjeru.
- U ovom dijelu definiramo lambdu i odmah je pozivamo prosljeฤujuฤi niz kao argument. To je neลกto ลกto se zove IIFE, a o tome ฤete saznati viลกe u sljedeฤim odjeljcima ovog vodiฤa.
Primjer 4
Pogledajmo posljednji primjer da bismo razumjeli kako se izvrลกavaju lambda i regularne funkcije. Dakle, otvorite svoje 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 pogrijeลกili, rezultat bi trebao biti otprilike ovaj.
Izlaz:
printer 1 REGULAR CALL printer 2 REGULAR CALL printer 1 LAMBDA CALL printer 2 LAMBDA CALL
Objaลกnjenje koda
- Funkcija zvana guru koja uzima drugu funkciju kao prvi parametar i sve ostale argumente koji slijede.
- printer_one je jednostavna funkcija koja ispisuje parametar koji joj je proslijeฤen i vraฤa ga.
- printer_two je sliฤan printer_one ali bez naredbe return.
- U ovom dijelu pozivamo funkciju guru i prosljeฤujemo funkcije pisaฤa i niz kao parametre.
- Ovo je sintaksa za postizanje ฤetvrtog koraka (tj. pozivanja guru funkcije), 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. Shvatimo ovo na primjeru; zapali 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]
Objaลกnjenje koda:
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 karte koristi se za primjenu odreฤene operacije na svaki element u nizu. Kao i filter(), takoฤer ima 2 parametra:
- Funkcija koja definira operaciju za izvoฤenje 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]
[KR1]
Objaลกnjenje koda:
- Ovdje definiramo popis nazvan nizovi koji sadrลพi neke brojeve.
- Deklariramo varijablu pod nazivom filtered_result koja ฤe pohraniti mapirane vrijednosti
- Lambda funkcija koja se pokreฤe na svakom elementu popisa i vraฤa kvadrat tog broja.
- Ispiลกite rezultat koji je vratila funkcija karte.
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) Saฤuvajte 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
Objaลกnjenje koda:
- Uvezi smanjenje iz modula functools
- Ovdje definiramo popis nazvan nizovi koji sadrลพi neke brojeve.
- Deklariramo varijablu koja se zove proizvod koja ฤe pohraniti smanjenu vrijednost
- Lambda funkcija koja se izvodi na svakom elementu popisa. Vratit ฤe umnoลพak tog broja prema prethodnom rezultatu.
- Ispiลกite rezultat koji je vratila funkcija smanjivanja.
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 programeri pythona pri pisanju lambda.
Jedan od najฤeลกฤih sluฤajeva upotrebe lambda je u funkcionalnom programiranju kao Python podrลพava paradigmu (ili stil) programiranja poznatu kao funkcionalno programiranje.
Omoguฤuje vam pruลพanje funkcije kao parametra drugoj funkciji (na primjer, u karti, filtru itd.). U takvim sluฤajevima koriลกtenje lambda nudi elegantan naฤin za stvaranje jednokratne funkcije i njezino prosljeฤivanje 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, lambda su [vV4][J5] samo funkcije koje nemaju identifikator vezan uz sebe. Jednostavnije reฤeno, to su funkcije bez imena (dakle, anonimne). Ovdje je tablica koja ilustrira razliku izmeฤu lambda i regularnih funkcija u pythonu.
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 povezano s njima. Zbog toga 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 trebale bi 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 to. 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 lambda jer se ona moลพe odmah pozvati (pogledajte sljedeฤi odjeljak). Kao ลกto ฤete vidjeti u sljedeฤem primjeru, 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.
Kao ลกto moลพete vidjeti na dijagramu, python interpreter obraฤuje dvije definicije na isti naฤin kada se pretvaraju u bajt kod. Sada ne moลพete imenovati funkciju ร jer je rezerviran od strane Python, ali bilo koje drugo ime funkcije dat ฤe isti bajt kod [KR6].
Rezime
- Lambda, takoฤer poznate kao anonimne funkcije, male su, ograniฤene funkcije koje ne trebaju ime (tj. identifikator).
- Svaka lambda funkcija u Python ima 3 bitna dijela:
- Kljuฤna rijeฤ lambda.
- Parametri (ili vezane varijable) i
- Tijelo funkcije.
- Sintaksa za pisanje lambda je: lambda parametar: izraz
- Lambde mogu imati bilo koji broj parametara, ali nisu u zagradama
- Lambda moลพe imati samo 1 izraz u svom tijelu funkcije, koji se vraฤa prema zadanim postavkama.
- Na razini bajt-koda, nema velike razlike izmeฤu naฤina na koji tumaฤ obraฤuje lambda i regularne funkcije.
- Lambda podrลพavaju IIFE kroz ovu sintaksu: (lambda parametar: izraz)(argument)
- Lambda se obiฤno koristi sa sljedeฤim Python ugraฤenim komponentama:
- Filtar: filtar (lambda parametar: izraz, iterable-sekvenca)
- Karta: mapa (lambda parametar: izraz, iterable-sequences)
- Smanji: smanji (lambda parametar1, parametar2: izraz, iterable-sekvenca)
- Nemojte pisati komplicirane lambda funkcije u proizvodnom okruลพenju jer ฤe to biti teลกko za osobe koje odrลพavaju kod.
[J5]Dodao sam tablicu, ali je objaลกnjenje potrebno za razumijevanje razlika.
