Python Lambda funkcije s PRIMJERIMA

Sadržaj:

Anonim

Što je Lambda funkcija u Pythonu?

Lambda funkcija u Pythonu programiranje je anonimni funkcija ili funkcija koja nema ime. To je mala i ograničena funkcija koja nema više od jedne linije. Baš kao i normalna funkcija, Lambda funkcija može imati više argumenata s jednim izrazom.

U Pythonu se lambda izrazi (ili lambda oblici) koriste za konstrukciju anonimnih funkcija. Da biste to učinili, upotrijebit ćete lambda ključnu riječ (baš kao što koristite def za definiranje normalnih funkcija). Svaka anonimna funkcija koju definirate u Pythonu 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 jednom retku koda i također se može odmah pozvati. Sve ćete to na djelu vidjeti u sljedećim primjerima.

U ovom uputstvu za Lambda u Pythonu naučit ćete:

  • Sintaksa i primjeri
  • Korištenje lambda s ugrađenim Pythonom
  • lambda u filtru ()
  • lambda na karti ()
  • lambda u reduciranju ()
  • Zašto (i zašto ne) koristiti lambda funkcije?
  • Lambda protiv redovitih funkcija

Sintaksa i primjeri

Formalna sintaksa za pisanje lambda funkcije daje se u nastavku:

lambda p1, p2: expression 

Ovdje su p1 i p2 parametri koji se prosljeđuju lambda funkciji. Možete dodati onoliko parametara koliko vam je potrebno.

Međutim, primijetite da oko parametara ne koristimo zagrade kao što je to slučaj s uobičajenim funkcijama. Posljednji dio (izraz) je bilo koji valjani python izraz koji djeluje na parametre koje pružate funkciji.

Primjer 1

Sad kad znate za lambde, probajmo s primjerom. Dakle, otvorite svoj IDLE i unesite sljedeće:

adder = lambda x, y: x + yprint (adder (1, 2))

Evo rezultata:

3

Objašnjenje koda

Ovdje definiramo varijablu koja će sadržavati rezultat vraćen lambda funkcijom.

1. Ključna riječ lambda koja se koristi za definiranje anonimne funkcije.

2. x i y su parametri koje prenosimo na lambda funkciju.

3. Ovo je tijelo funkcije, koje 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 isprintati lambda-u i vidjeti rezultat. Ponovno otvorite svoj IDLE i unesite sljedeće:

#What a lambda returnsstring='some kind of a useless lambda'print(lambda string : print(string))

Sada spremite datoteku i pritisnite F5 da biste pokrenuli program. Ovo je izlaz koji biste trebali dobiti.

Izlaz:

 at 0x00000185C3BF81E0>

Što se ovdje događa? Pogledajmo kod da bismo ga dalje razumjeli.

Objašnjenje koda

  1. Ovdje definiramo niz koji ćete proslijediti kao parametar lambdi.
  2. Deklariramo lambda koji poziva ispis i ispisuje rezultat.

Ali zašto program ne ispiše niz koji prolazimo? To je zato što sama lambda vraća objekt funkcije. U ovom primjeru funkcija ispisa ne poziva lambda, već jednostavno vraća objekt funkcije i memorijsko mjesto na kojem je pohranjena. To se tiska na konzoli.

Primjer 3

Međutim, ako napišete ovakav program:

#What a lambda returns #2x="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 i niz koji prođemo ispisuje se na konzoli. Ali kakva je ta čudna sintaksa i zašto je lambda definicija prekrivena zagradama? Shvatimo to sada.

Objašnjenje koda

  1. Evo istog niza koji smo definirali u prethodnom primjeru.
  2. U ovom dijelu definiramo lambdu i pozivamo je odmah predavanjem niza kao argumenta. To se naziva IIFE, a o njemu ćete saznati više u sljedećim odjeljcima ovog vodiča.

Primjer 4

Pogledajmo posljednji primjer kako bismo razumjeli kako se izvršavaju lambda i regularne funkcije. Dakle, otvorite svoj IDLE i u novu datoteku unesite sljedeće:

#A REGULAR FUNCTIONdef guru( funct, *args ):funct( *args )def printer_one( arg ):return print (arg)def printer_two( arg ):print(arg)#CALL A REGULAR FUNCTIONguru( printer_one, 'printer 1 REGULAR CALL' )guru( printer_two, 'printer 2 REGULAR CALL \n' )#CALL A REGULAR FUNCTION THRU A LAMBDAguru(lambda: printer_one('printer 1 LAMBDA CALL'))guru(lambda: printer_two('printer 2 LAMBDA CALL'))

Sada spremite datoteku i pritisnite F5 da biste pokrenuli program. Ako niste pogriješili, izlaz bi trebao biti otprilike ovakav.

Izlaz:

printer 1 REDOVNI POZIV

printer 2 REDOVNI POZIV

printer 1 LAMBDA POZIV

printer 2 LAMBDA POZIV

Objašnjenje koda

  1. Funkcija koja se naziva guru koja uzima drugu funkciju kao prvi parametar i sve druge argumente koji je slijede.
  2. printer_one je jednostavna funkcija koja ispisuje prosljeđeni parametar i vraća ga.
  3. printer_two je sličan printer_one, ali bez povratne izjave.
  4. U ovom dijelu pozivamo funkciju guru i kao parametre prosljeđujemo funkcije pisača i niz.
  5. Ovo je sintaksa za postizanje četvrtog koraka (tj. Pozivanje funkcije gurua), ali korištenjem lambda-a.

U sljedećem ćete odjeljku naučiti kako koristiti lambda funkcije s mapom (), smanjiti () i filtrirati () u Pythonu.

Korištenje lambda s ugrađenim Pythonom

Lambda funkcije pružaju elegantan i moćan način izvođenja operacija pomoću ugrađenih metoda u Pythonu. Moguće je jer se lambde mogu odmah pozvati i proslijediti ih kao argument tim funkcijama.

IIFE u Python Lambda

IIFE označava izvršavanje funkcije s neposrednim pozivom . To znači da se lambda funkcija može pozvati čim je definirana. Shvatimo to na primjeru; upalite svoj IDLE i unesite sljedeće:

 (lambda x: x + x)(2) 

Evo objašnjenja rezultata i koda:

Ova sposobnost lambda-a da se odmah pozovu omogućuje vam upotrebu unutar funkcija poput map () i smanjenja (). Korisno je jer ove funkcije možda nećete htjeti ponovno koristiti.

lambda u filtru ()

Funkcija filtra koristi se za odabir određenih elemenata iz niza elemenata. Slijed može biti bilo koji iterator poput popisa, skupova, korijena itd.

Odabrani elementi temelje se na nekim unaprijed definiranim ograničenjima. Potrebna su 2 parametra:

  • Funkcija koja definira ograničenje filtriranja
  • Niz (bilo koji iterator poput popisa, korijena 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 prvom iskazu definiramo popis zvan sekvence koji sadrži neke brojeve.

2. Ovdje deklariramo varijablu nazvanu filtered_result, koja će pohraniti filtrirane vrijednosti koje vraća funkcija filter ().

3. Lambda funkcija koja se izvodi na svakom elementu popisa i vraća vrijednost true ako je veća od 4.

4. Ispišite rezultat koji je vratila funkcija filtra.

lambda na karti ()

funkcija karte koristi se za primjenu određene operacije na svaki element u nizu. Poput filtra (), također su potrebna dva parametra:

  1. Funkcija koja definira opciju koja će se izvoditi 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, 121, 0, 1]

[KR1]

Objašnjenje koda:

  1. Ovdje definiramo popis nazvan sekvence koji sadrži neke brojeve.
  2. Deklariramo varijablu nazvanu filtered_result koja će pohraniti mapirane vrijednosti
  3. Lambda funkcija koja se izvodi na svakom elementu popisa i vraća kvadrat tog broja.
  4. Ispišite rezultat koji je vratila funkcija karte.

lambda u reduciranju ()

Funkcija redukcije, poput map (), koristi se za primjenu operacije na svaki element u nizu. Međutim, razlikuje se od karte po svom radu. Ovo su koraci koje slijedi funkcija reduce () za izračunavanje rezultata:

Korak 1) Izvršite definiranu operaciju na prva 2 elementa niza.

Korak 2) Spremite ovaj rezultat

Korak 3) Izvršite operaciju sa spremljenim rezultatom i sljedećim elementom u nizu.

Korak 4) Ponavljajte dok više nema elemenata.

Potrebna su i dva parametra:

  1. Funkcija koja definira operaciju koju treba izvršiti
  2. Niz (bilo koji iterator poput popisa, korijena itd.)

Na primjer, ovdje je program koji vraća proizvod svih elemenata na popisu:

from functools import reducesequences = [1,2,3,4,5]product = reduce (lambda x, y: x*y, sequences)print(product)

Evo rezultata:

120

Objašnjenje koda:

  1. Uvezi redukciju iz modula functools
  2. Ovdje definiramo popis nazvan sekvence koji sadrži neke brojeve.
  3. Deklariramo varijablu koja se naziva 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 smanjenja.

Zašto (i zašto ne) koristiti lambda funkcije?

Kao što ćete vidjeti u sljedećem odjeljku, lambda se tretira isto kao i redovite funkcije na razini tumača. Na neki način, mogli biste reći da lambde pružaju kompaktnu sintaksu za pisanje funkcija koje vraćaju jedan izraz.

Međutim, trebali biste znati kada je dobro koristiti lambde i kada ih izbjegavati. U ovom ćete odjeljku naučiti neke od principa dizajna koje su programeri pythona koristili prilikom pisanja lambda.

Jedan od najčešćih slučajeva upotrebe lambdas je u funkcionalnom programiranju jer Python podržava paradigmu (ili stil) programiranja poznat kao funkcionalno programiranje.

Omogućuje vam pružanje funkcije kao parametra drugoj funkciji (na primjer, na karti, filtru itd.). U takvim slučajevima upotreba lambda nudi elegantan način za stvaranje jednokratne funkcije i prosljeđivanje kao parametar.

Kada ne biste trebali koristiti Lambdu?

Nikada ne biste trebali pisati komplicirane lambda funkcije u proizvodnom okruženju. Koderi koji održavaju vaš kôd bit će vrlo teško dešifrirati ga. Ako se založite za izradu složenih jednolinijskih izraza, bila bi puno superiornija praksa definirati odgovarajuću funkciju. Kao najbolju praksu, morate imati na umu da je jednostavni kod uvijek bolji od složenog.

Lambda protiv redovitih funkcija

Kao što je prethodno rečeno, lambda su [vV4] [J5] samo funkcije koje nemaju identifikator vezan za njih. Jednostavnijim riječima, to su funkcije bez imena (dakle, anonimne). Evo tablice koja ilustrira razliku između lambda i regularnih funkcija u pythonu.

Lambda

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 u svom tijelu imati više izraza i izjava.

Lambde s njima nisu povezane. Zbog toga su poznate i kao anonimne funkcije.

Redovne funkcije moraju imati ime i potpis.

Lambde ne sadrže izjavu o povratku, jer se tijelo automatski vraća.

Funkcije koje trebaju vratiti vrijednost trebale bi sadržavati naredbu return.

Objašnjenje razlika?

Primarna razlika između lambda i regularne funkcije je u tome što lambda funkcija procjenjuje samo jedan izraz i daje objekt funkcije. Slijedom toga, možemo imenovati rezultat lambda funkcije i koristiti ga u našem programu kao što smo to učinili u prethodnom primjeru.

Redovita funkcija za gornji primjer izgledala bi ovako:

def adder (x, y):return x + yprint (adder (1, 2))

Ovdje moramo definirati ime funkcije koja vraća rezultat kad je pozovemo . Lambda funkcija ne sadrži izraz return jer će imati samo jedan izraz koji se uvijek vraća prema zadanim postavkama. Ne morate ni dodijeliti lambdu, 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 ugrađenim Pythonovim funkcijama.

Međutim, možda se i dalje pitate kako se lambda razlikuje od funkcije koja vraća jedan izraz (poput gornjeg). Na razini tumača nema velike razlike. Možda zvuči iznenađujuće, ali tumač svaku lambda funkciju koju definirate u Pythonu tretira kao normalnu funkciju.

Kao što možete vidjeti na dijagramu, dvije definicije obrađuju python interpreter na isti način kada se pretvaraju u bytecode. Sada ne možete imenovati funkciju lambda, jer ju je rezervirao Python, ali bilo koje drugo ime funkcije dobit će isti bajtkod [KR6].

Sažetak

  • Lambda, poznate i kao anonimne funkcije, male su, ograničene funkcije kojima nije potrebno ime (tj. Identifikator).
  • Svaka lambda funkcija u Pythonu 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 zatvorene u zagrade
  • Lambda može imati samo 1 izraz u svom tijelu funkcije, koji se vraća prema zadanim postavkama.
  • Na razini bajtkoda nema velike razlike između načina na koji tumač rukuje lambdama i redovnim funkcijama.
  • Lambde podržavaju IIFE kroz ovu sintaksu: (lambda parametar: izraz) (argument)
  • Lambde se obično koriste sa sljedećim ugrađenim pitonima:
  • Filter: filter (lambda parametar: izraz, ponovljivi slijed)
  • Karta: karta (lambda parametar: izraz, iterabilne sekvence)
  • Smanji: smanji (lambda parametar1, parametar2: izraz, iterabilni slijed)
  • Nemojte pisati komplicirane lambda funkcije u proizvodnom okruženju jer će održavateljima koda biti teško.

[J5] Dodao sam tablicu, ali objašnjenje je potrebno da bi se razumjele razlike.