„Python Lambda“ funkcijos su PAVYZDŽIAIS

Kas yra „Lambda“ funkcija „Python“?

Lambda“ funkcija programuojant „ Python“ yra anoniminė funkcija arba funkcija, neturinti pavadinimo. Tai maža ir ribota funkcija, turinti ne daugiau kaip vieną eilutę. Kaip ir įprasta funkcija, „Lambda“ funkcija gali turėti kelis argumentus su viena išraiška.

„Python“ sistemoje anoniminėms funkcijoms kurti naudojamos lambda išraiškos (arba lambda formos). Norėdami tai padaryti, naudosite „ lambda“ raktinį žodį (taip pat, kaip apibrėždami įprastas funkcijas, naudosite def ). Kiekviena anoniminė funkcija, kurią apibrėžiate „Python“, turės 3 esmines dalis:

  • „Lambda“ raktinis žodis.
  • Parametrai (arba susieti kintamieji) ir
  • Funkcijos kūnas.

Lambda funkcija gali turėti bet kokį skaičių parametrų, tačiau funkcijos kūnelyje gali būti tik viena išraiška. Be to, „lambda“ yra parašyta vienoje kodo eilutėje ir taip pat gali būti nedelsiant iškviesta. Visa tai pamatysite veiksmuose būsimuose pavyzdžiuose.

Šioje „Lambda in Python“ mokymo programoje sužinosite:

  • Sintaksė ir pavyzdžiai
  • Naudojant „lambdas“ su „Python“ įtaisais
  • lambdas filtre ()
  • lambdas žemėlapyje ()
  • lambdas redukcijoje ()
  • Kodėl (ir kodėl gi ne) naudojamos lambda funkcijos?
  • Lambdas ir reguliarios funkcijos

Sintaksė ir pavyzdžiai

Formali sintaksė norint parašyti lambda funkciją yra tokia:

lambda p1, p2: expression 

Čia p1 ir p2 yra parametrai, perduodami lambda funkcijai. Parametrų galite pridėti tiek, kiek jums reikia.

Tačiau atkreipkite dėmesį, kad nenaudojame skliaustų aplink parametrus, kaip tai darome su įprastomis funkcijomis. Paskutinė dalis (išraiška) yra bet kuri galiojanti pitono išraiška, veikianti pagal parametrus, kuriuos pateikiate funkcijai.

1 pavyzdys

Dabar, kai žinote apie lambdas, pabandykime tai su pavyzdžiu. Taigi, atidarykite savo IDLE ir įveskite:

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

Štai išvestis:

3

Kodo paaiškinimas

Čia mes apibrėžiame kintamąjį, kuris išlaikys lambda funkcijos grąžintą rezultatą.

1. „lambda“ raktinis žodis, naudojamas apibrėžti anoniminę funkciją.

2. x ir y yra parametrai, kuriuos perduodame lambda funkcijai.

3. Tai yra funkcijos kūnas, kuris prideda 2 mūsų perduotus parametrus. Atkreipkite dėmesį, kad tai yra viena išraiška. Negalite parašyti kelių sakinių į lambda funkcijos kūną.

4. Iškviečiame funkciją ir atspausdiname grąžintą vertę.

2 pavyzdys

Tai buvo pagrindinis pavyzdys norint suprasti lambda pagrindus ir sintaksę. Pabandykime dabar atspausdinti lambda ir pamatyti rezultatą. Vėlgi atidarykite savo IDLE ir įveskite:

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

Dabar išsaugokite failą ir paspauskite F5, kad paleistumėte programą. Tai yra rezultatas, kurį turėtumėte gauti.

Išvestis:

 at 0x00000185C3BF81E0>

Kas čia vyksta? Pažvelkime į kodą, kad suprastume toliau.

Kodo paaiškinimas

  1. Čia mes apibrėžiame eilutę, kurią perduosite kaip „lambda“ parametrą.
  2. Mes paskelbiame lambda, kuri iškviečia spausdintą ataskaitą ir atspausdina rezultatą.

Bet kodėl programa nespausdina eilutės, kurią perduodame? Taip yra todėl, kad pati lambda grąžina funkcijos objektą. Šiame pavyzdyje, lambda yra nėra vadinamas pagal spausdinimo funkciją, bet tiesiog grįžta funkcija objektą ir atminties vietą, kurioje jis yra saugomas. Tai yra atspausdinta konsolėje.

3 pavyzdys

Tačiau jei parašysite tokią programą:

#What a lambda returns #2x="some kind of a useless lambda"(lambda x : print(x))(x)

Ir paleiskite jį paspausdami F5, pamatysite tokį išėjimą.

Išvestis:

some kind of a useless lambda

Dabar skambinama „lambda“, o eilutė, kurią perduodame, atspausdinama konsolėje. Bet kokia ta keista sintaksė ir kodėl skliausteliuose yra lambda apibrėžimas? Supraskime tai dabar.

Kodo paaiškinimas

  1. Čia yra ta pati eilutė, kurią mes apibrėžėme ankstesniame pavyzdyje.
  2. Šioje dalyje mes apibrėžiame lambda ir nedelsdami ją vadiname, perduodant eilutę kaip argumentą. Tai yra kažkas, vadinamas IIFE, ir apie tai sužinosite būsimuose šios pamokos skyriuose.

4 pavyzdys

Pažvelkime į paskutinį pavyzdį, kad suprastume, kaip vykdomos lambdas ir reguliarios funkcijos. Taigi atidarykite savo IDLE ir naujame faile įveskite:

#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'))

Dabar išsaugokite failą ir paspauskite F5, kad paleistumėte programą. Jei nepadarėte klaidų, išvestis turėtų būti maždaug tokia.

Išvestis:

spausdintuvas 1 REGULIARUS SKAMBINIMAS

spausdintuvas 2 Reguliarus skambutis

spausdintuvas 1 LAMBDA CALL

spausdintuvas 2 LAMBDA CALL

Kodo paaiškinimas

  1. Funkcija, vadinama guru, kuri ima kitą funkciją kaip pirmąjį parametrą ir visus kitus po jo esančius argumentus.
  2. printer_one yra paprasta funkcija, kuri atspausdina jam perduotą parametrą ir grąžina jį.
  3. printer_two yra panašus į printer_one, bet be grąžinimo sakinio.
  4. Šioje dalyje parametrus vadiname guru funkcija ir spausdintuvo funkcijų bei eilutės perdavimu.
  5. Tai yra sintaksė norint pasiekti ketvirtą žingsnį (ty iškviesti guru funkciją), bet naudojant lambdas.

Kitame skyriuje sužinosite, kaip naudoti „lambda“ funkcijas su „ map“ (), redukuoti () ir filtruoti () „Python“.

Naudojant „lambdas“ su „Python“ įtaisais

„Lambda“ funkcijos yra elegantiškas ir galingas būdas atlikti operacijas naudojant integruotus „Python“ metodus. Tai įmanoma, nes lambdas galima nedelsiant iškviesti ir perduoti kaip argumentą šioms funkcijoms.

IIFE „Python Lambda“

IIFE reiškia iškart iškviečiamą funkcijos vykdymą. Tai reiškia, kad lambda funkcija gali būti iškviečiama, kai tik ji yra apibrėžta. Supraskime tai su pavyzdžiu; suaktyvinkite savo IDLE ir įveskite:

 (lambda x: x + x)(2) 

Čia yra išvesties ir kodo paaiškinimas:

Šis lambdų gebėjimas būti nedelsiant iškviečiamas leidžia juos naudoti tokiose funkcijose kaip žemėlapis () ir mažinti (). Tai naudinga, nes galbūt nenorėsite daugiau naudoti šių funkcijų.

lambdas filtre ()

Filtro funkcija naudojama tam tikriems elementams pasirinkti iš elementų sekos. Seka gali būti bet koks iteratorius, pvz., Sąrašai, rinkiniai, rinkiniai ir kt.

Pasirinkti elementai yra pagrįsti tam tikru iš anksto nustatytu apribojimu. Tam reikalingi 2 parametrai:

  • Funkcija, apibrėžianti filtravimo apribojimą
  • Seka (bet koks iteratorius, pvz., Sąrašai, rinkiniai ir kt.)

Pavyzdžiui,

sequences = [10,2,8,7,5,4,3,11,0, 1]filtered_result = filter (lambda x: x > 4, sequences)print(list(filtered_result))

Štai išvestis:

[10, 8, 7, 5, 11]

Kodo paaiškinimas:

1. Pirmajame sakinyje mes apibūdiname sąrašą, vadinamą sekomis, kuriame yra keletas skaičių.

2. Čia deklaruojame kintamąjį, vadinamą „filtered_result“, kuris išsaugos filtruotas reikšmes, kurias grąžina funkcija filter ().

3. Lambda funkcija, kuri veikia kiekviename sąrašo elemente ir grąžina reikšmę „true“, jei ji yra didesnė nei 4.

4. Atspausdinkite filtro funkcijos grąžintą rezultatą.

lambdas žemėlapyje ()

žemėlapio funkcija naudojama tam tikrai operacijai pritaikyti kiekvienam sekos elementui. Kaip filtras (), taip pat reikia dviejų parametrų:

  1. Funkcija, apibrėžianti op, kurią reikia atlikti elementams
  2. Viena ar daugiau sekų

Pavyzdžiui, čia yra programa, kuri išspausdina skaičių kvadratus pateiktame sąraše:

sequences = [10,2,8,7,5,4,3,11,0, 1]filtered_result = map (lambda x: x*x, sequences)print(list(filtered_result))

Išvestis:

 [100, 4, 64, 49, 25, 16, 121, 0, 1]

[KR1]

Kodo paaiškinimas:

  1. Čia mes apibrėžiame sąrašą, vadinamą sekomis, kuriame yra keletas skaičių.
  2. Mes paskelbiame kintamąjį, vadinamą „filtered_result“, kuris išsaugos susietas reikšmes
  3. Lambda funkcija, kuri veikia kiekviename sąrašo elemente ir grąžina to skaičiaus kvadratą.
  4. Atspausdinkite žemėlapio funkcijos grąžintą rezultatą.

lambdas redukcijoje ()

Sumažinimo funkcija, kaip ir žemėlapis (), naudojama operacijai pritaikyti kiekvienam sekos elementui. Tačiau jis skiriasi nuo žemėlapio savo veikimu. Norėdami apskaičiuoti išvestį, atlikite redukcijos () funkciją:

1 žingsnis) Atlikite apibrėžtą operaciją su pirmaisiais 2 sekos elementais.

2 žingsnis) Išsaugokite šį rezultatą

3 žingsnis) Atlikite operaciją su išsaugotu rezultatu ir kitu elementu sekoje.

4 žingsnis) Pakartokite tol, kol neliks daugiau elementų.

Taip pat reikia dviejų parametrų:

  1. Funkcija, apibrėžianti atliekamą operaciją
  2. Seka (bet koks iteratorius, pvz., Sąrašai, rinkiniai ir kt.)

Pavyzdžiui, čia yra programa, kuri pateikia visų sąrašo elementų sandaugą:

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

Štai išvestis:

120

Kodo paaiškinimas:

  1. Importo sumažinimas iš „functools“ modulio
  2. Čia mes apibrėžiame sąrašą, vadinamą sekomis, kuriame yra keletas skaičių.
  3. Mes skelbiame kintamąjį, vadinamą produktu, kuriame bus išsaugota sumažinta vertė
  4. Lambda funkcija, veikianti kiekviename sąrašo elemente. Tai grąžins šio skaičiaus sandaugą pagal ankstesnį rezultatą.
  5. Atspausdinkite rezultatą, kurį grąžino funkcija „sumažinimas“.

Kodėl (ir kodėl gi ne) naudojamos lambda funkcijos?

Kaip pamatysite kitame skyriuje, su lambda vertėjo žodžiu lygiai taip pat kaip ir su įprastomis funkcijomis. Tam tikra prasme galite pasakyti, kad lambdas pateikia kompaktišką sintaksę rašymo funkcijoms, kurios pateikia vieną išraišką.

Tačiau turėtumėte žinoti, kada verta naudoti lambdas ir kada jų vengti. Šiame skyriuje sužinosite keletą projektavimo principų, kuriuos pitonų kūrėjai naudoja rašydami lambdas.

Vienas iš dažniausiai naudojamų „lambdas“ atvejų yra funkciniame programavime, nes „Python“ palaiko programavimo paradigmą (arba stilių), vadinamą funkciniu programavimu.

Tai leidžia jums pateikti funkciją kaip kitos funkcijos parametrą (pavyzdžiui, žemėlapyje, filtre ir kt.). Tokiais atvejais naudojant lambdas siūlomas elegantiškas būdas sukurti vienkartinę funkciją ir perduoti ją kaip parametrą.

Kada neturėtumėte naudoti „Lambda“?

Niekada neturėtumėte rašyti sudėtingų lambda funkcijų gamybos aplinkoje. Koduotojams, kurie prižiūri jūsų kodą, bus labai sunku jį iššifruoti. Jei susiduriate su sudėtingomis vienos linijos išraiškomis, apibrėžti tinkamą funkciją būtų daug pranašesnė praktika. Kaip geriausią praktiką turite atsiminti, kad paprastas kodas visada yra geriau nei sudėtingas kodas.

Lambdas ir reguliarios funkcijos

Kaip minėta anksčiau, lambdos yra tik [vV4] [J5] funkcijos, prie kurių nėra susietas identifikatorius. Paprasčiau tariant, tai funkcijos be pavadinimų (vadinasi, anoniminės). Čia yra lentelė, iliustruojanti skirtumą tarp lambdas ir įprastų pitono funkcijų.

Lambdas

Reguliarios funkcijos

Sintaksė:

lambda x : x + x 

Sintaksė:

def (x) :return x + x

Lambda funkcijos gali turėti tik vieną išraišką jų kūne.

Reguliarios funkcijos gali turėti kelias išraiškas ir teiginius jų kūne.

Lambdas neturi susieto pavadinimo. Štai kodėl jos taip pat žinomos kaip anoniminės funkcijos.

Įprastos funkcijos turi turėti vardą ir parašą.

„Lambdoje“ nėra grąžinimo teiginio, nes kūnas automatiškai grąžinamas.

Į funkcijas, kurioms reikia grąžinti vertę, turėtų būti grąžinimo ataskaita.

Skirtumų paaiškinimas?

Pagrindinis skirtumas tarp lambda ir reguliariosios funkcijos yra tas, kad lambda funkcija vertina tik vieną išraišką ir duoda funkcijos objektą. Vadinasi, galime įvardinti „lambda“ funkcijos rezultatą ir naudoti jį savo programoje, kaip tai darėme ankstesniame pavyzdyje.

Reguliari aukščiau pateikto pavyzdžio funkcija atrodytų taip:

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

Čia mes turime apibrėžti funkcijos pavadinimą , kuris grąžina rezultatą, kai mes jį vadiname . Funkcijoje „lambda“ nėra grąžinimo sakinio, nes joje bus tik viena išraiška, kuri visada bus grąžinta pagal numatytuosius nustatymus. Net nereikia priskirti „lambda“, nes jį galima iškart panaudoti (žr. Kitą skyrių). Kaip pamatysite kitame pavyzdyje, „lambdas“ tampa ypač galingi, kai juos naudojame su „Python“ integruotosiomis funkcijomis.

Tačiau jums vis tiek gali kilti klausimas, kuo lambda skiriasi nuo funkcijos, kuri pateikia vieną išraišką (kaip aukščiau). Vertėjo lygiu nėra didelio skirtumo. Tai gali skambėti stebėtinai, tačiau bet kuri „lambda“ funkcija, kurią apibrėžiate „Python“, vertėjas traktuoja kaip įprastą funkciją.

Kaip matote diagramoje, abu apibrėžimus pitono vertėjas vertina vienodai, kai jie konvertuojami į baitų kodą. Dabar negalite pavadinti funkcijos lambda, nes ją rezervuoja „Python“, tačiau bet kuris kitas funkcijos pavadinimas suteiks tą patį baitkodą [KR6].

Santrauka

  • „Lambdas“, dar vadinamos anoniminėmis funkcijomis, yra mažos, ribotos funkcijos, kurioms nereikia vardo (ty identifikatoriaus).
  • Kiekvieną „Python“ „lambda“ funkciją sudaro 3 esminės dalys:
  • „Lambda“ raktinis žodis.
  • Parametrai (arba susieti kintamieji) ir
  • Funkcijos kūnas.
  • Lambda rašymo sintaksė yra: lambda parametras: išraiška
  • Lambdas gali turėti bet kokį skaičių parametrų, tačiau jie nėra uždaryti petnešomis
  • Lambda funkcijos kūne gali būti tik 1 išraiška, kuri pagal numatytuosius nustatymus grąžinama.
  • Baitų kodų lygyje nėra didelio skirtumo tarp to, kaip vertėjas tvarko lambdas ir įprastas funkcijas.
  • „Lambdas“ palaiko IIFE per šią sintaksę: (lambda parametras: išraiška) (argumentas)
  • „Lambdas“ dažniausiai naudojami su šiais „python“ įtaisais:
  • Filtras: filtras (lambda parametras: išraiška, iteruojama seka)
  • Žemėlapis: žemėlapis (lambda parametras: išraiška, kartojamos sekos)
  • Sumažinti: sumažinti (lambda parametras1, parametras2: išraiška, iteruojama seka)
  • Nerašykite sudėtingų „lambda“ funkcijų gamybos aplinkoje, nes kodų prižiūrėtojams bus sunku.

[J5] Pridėjau lentelę, tačiau paaiškinimas yra būtinas norint suprasti skirtumus.

Įdomios straipsniai...