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

  1. Ovdje definiramo a niz koju ฤ‡ete proslijediti kao parametar lambdi.
  2. 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

  1. Ovdje je isti niz koji smo definirali u prethodnom primjeru.
  2. 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

  1. Funkcija zvana guru koja uzima drugu funkciju kao prvi parametar i sve ostale argumente koji slijede.
  2. printer_one je jednostavna funkcija koja ispisuje parametar koji joj je proslijeฤ‘en 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 kao parametre.
  5. 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:

  1. Funkcija koja definira operaciju za izvoฤ‘enje 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]

[KR1]

Objaลกnjenje koda:

  1. Ovdje definiramo popis nazvan nizovi koji sadrลพi neke brojeve.
  2. Deklariramo varijablu pod nazivom filtered_result koja ฤ‡e pohraniti mapirane vrijednosti
  3. Lambda funkcija koja se pokreฤ‡e na svakom elementu popisa i vraฤ‡a kvadrat tog broja.
  4. 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:

  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

Objaลกnjenje koda:

  1. Uvezi smanjenje iz modula functools
  2. Ovdje definiramo popis nazvan nizovi koji sadrลพi neke brojeve.
  3. Deklariramo varijablu koja se zove proizvod koja ฤ‡e pohraniti smanjenu vrijednost
  4. Lambda funkcija koja se izvodi na svakom elementu popisa. Vratit ฤ‡e umnoลพak tog broja prema prethodnom rezultatu.
  5. 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.

Saลพmite ovu objavu uz: