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.