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: