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().

  • 🔑 Ključna riječ Lambda: Lambda se piše kao lambda argumenti: izraz, bez definicije, bez imena i bez eksplicitne naredbe return.
  • 🧮 Jedan izraz: Tijelo sadrži točno jedan izraz čija se vrijednost automatski vraća, tako da naredbe i više redaka nisu dopušteni.
  • 🔗 Ugrađeno uparivanje: Lambde se obično prosljeđuju funkcijama map(), filter(), reduce() i sorted() za transformaciju ili odabir elemenata u nizu.
  • IIFE: Lambda se može definirati i odmah pozvati pomoću uzorka (lambda x: x + x)(2), vraćajući rezultat odjednom.
  • ⚖️ Protiv def: Regularne funkcije trebaju ime i mogu sadržavati mnogo naredbi, dok lambde tu moć žrtvuju za kompaktnu sintaksu od jednog retka.
  • 🤖 AI pomoć: AI asistenti poput GitHub Copilota generiraju lambda izraze za ključeve mapiranja, filtriranja i sortiranja iz kratkog prompta.

Python Lambda funkcije

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:

  1. Funkcija koja definira operaciju koja se izvodi na elementima
  2. 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:

  1. Funkcija koja definira operaciju koju treba izvesti
  2. 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.

Pitanja i odgovori

Da. Lambda može koristiti uvjetni izraz kao što je lambda x: 'even' if x % 2 == 0 else 'odd'. Ne može sadržavati punu if naredbu, jer tijelo lambde mora biti jedan izraz, a ne blok naredbi.

Općenito ne. PEP 8 preporučuje korištenje def-a kada funkciji treba ime, jer vezivanje lambde za varijablu daje joj ime, ali gubi jasnije značenje. traceback koji pruža def. Lambde je najbolje prenositi izravno funkcijama kao što su sorted(), map() ili filter().

Ne. Na razini bajtkoda Python tretira lambdu i ekvivalentnu definiciju na isti način, tako da nema prednosti u brzini. Lambda sprema samo liniju koda; ne izvršava se brže od imenovane funkcije koja obavlja identičan posao.

Da. Lambda može čitati varijable iz obuhvata petlje, formirajući tako zatvaranje. Unutar petlje budite oprezni: lambda bilježi samu varijablu, a ne njezinu trenutnu vrijednost, stoga upotrijebite zadani argument poput lambda x, n=n: x + n da biste je zamrznuli.

Proslijedite lambda kao ključni argument funkciji sorted() ili list.sort(). Na primjer, sorted(users, key=lambda u: u['age']) sortira stavke prema dobi. Lambda govori Python koju vrijednost usporediti za svaki element, dajući koncizno prilagođeno sortiranje bez zasebne imenovane funkcije.

Ne izravno, jer anonimna lambda nema ime na koje bi se mogla pozivati. To možete zaobići dodjeljivanjem lambde varijabli i pozivanjem tog imena, ali normalna def funkcija je jasniji i preporučeniji izbor za rekurziju.

Lambde pokreću brze, inline transformacije u AI i kodu strojnog učenja. Znanstvenici podataka ih prosljeđuju pandama .apply(), map() i filter() za čišćenje ili preoblikovanje podataka, a kao ključne funkcije za sortiranje značajki, keeping kompaktna predobrada unutar većih cjevovoda za obuku.

GitHub Copilot predlaže potpune lambda izraze iz kratkog komentara ili okolnog koda, uključujući ispravne parametre i izraz za pozive map(), filter() ili sorted(). Također može predložiti pretvaranje opširnog lambda izraza u jasniju imenovanu funkciju kada je čitljivost važna.

Sažmite ovu objavu uz: