Python Lambda darbojas ar PIEMĒRIEM

Satura rādītājs:

Anonim

Kas ir Lambda funkcija Python?

Lambda Funkcija Python programmēšanas ir anonīma funkcija vai funkciju, kam nav nosaukuma. Tā ir maza un ierobežota funkcija, kurai ir ne vairāk kā viena līnija. Tāpat kā normālai funkcijai, arī Lambda funkcijai var būt vairāki argumenti ar vienu izteiksmi.

Programmā Python anonīmu funkciju izveidošanai tiek izmantotas lambda izteiksmes (vai lambda formas). Lai to izdarītu, jūs izmantosiet lambda atslēgvārdu (tāpat kā def, lai definētu normālas funkcijas). Katrai anonīmai funkcijai, ko definējat Python, būs 3 būtiskas daļas:

  • Lambda atslēgvārds.
  • Parametri (vai piesaistītie mainīgie) un
  • Funkcijas ķermenis.

Lambda funkcijai var būt jebkurš parametru skaits, bet funkcijas ķermenī var būt tikai viena izteiksme. Turklāt lambda ir ierakstīta vienā koda rindiņā, un to var arī nekavējoties izsaukt. To visu jūs redzēsiet darbībā nākamajos piemēros.

Šajā Lambda Python apmācībā jūs uzzināsiet:

  • Sintakse un piemēri
  • Izmantojot lambdas ar Python iebūvētajiem
  • lambdas filtrā ()
  • lambdas kartē ()
  • lambdas mazinātājā ()
  • Kāpēc (un kāpēc ne) izmantot lambda funkcijas?
  • Lambdas pret regulārajām funkcijām

Sintakse un piemēri

Formālā sintakse lambda funkcijas rakstīšanai ir šāda:

lambda p1, p2: expression 

Šeit p1 un p2 ir parametri, kas tiek nodoti lambda funkcijai. Jūs varat pievienot tik daudz vai dažus parametrus, cik nepieciešams.

Tomēr ievērojiet, ka parametros mēs nelietojam iekavas, kā to darām ar parastajām funkcijām. Pēdējā daļa (izteiksme) ir jebkura derīga pitona izteiksme, kas darbojas ar parametriem, kurus norādījāt funkcijai.

1. piemērs

Tagad, kad jūs zināt par lambdas, izmēģināsim to ar piemēru. Tātad, atveriet savu IDLE un ierakstiet šo:

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

Šeit ir izeja:

3

Kods Paskaidrojums

Šeit mēs definējam mainīgo, kas saglabās lambda funkcijas atgriezto rezultātu.

1. Lambda atslēgvārds, ko izmanto, lai definētu anonīmu funkciju.

2. x un y ir parametri, kurus mēs nododam lambda funkcijai.

3. Šis ir funkcijas pamatteksts, kas saskaita 2 mūsu nodotos parametrus. Ievērojiet, ka tas ir viens izteiciens. Lambda funkcijas pamattekstā nevar ierakstīt vairākus apgalvojumus.

4. Mēs izsaucam funkciju un izdrukājam atgriezto vērtību.

2. piemērs

Tas bija pamatpiemērs, lai izprastu lambda pamatus un sintaksi. Tagad mēģināsim izdrukāt lambda un redzēt rezultātu. Atkal atveriet savu IDLE un ierakstiet šo:

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

Tagad saglabājiet failu un nospiediet taustiņu F5, lai palaistu programmu. Tas ir rezultāts, kas jums jāiegūst.

Izeja:

 at 0x00000185C3BF81E0>

Kas te notiek? Apskatīsim kodu, lai saprastu tālāk.

Kods Paskaidrojums

  1. Šeit mēs definējam virkni, kuru jūs nodosiet kā parametru lambda.
  2. Mēs paziņojam par lambda, kas izsauc drukātu paziņojumu un izdrukā rezultātu.

Bet kāpēc programma neizdrukā virkni, kurai mēs pārietam? Tas ir tāpēc, ka lambda pati atgriež funkcijas objektu. Šajā piemērā lambda netiek izsaukta ar drukas funkciju, bet vienkārši atgriež funkcijas objektu un atmiņas vietu, kur tā tiek glabāta. Tas tiek izdrukāts konsolē.

3. piemērs

Tomēr, ja jūs rakstāt šādu programmu:

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

Un palaidiet to, nospiežot F5, jūs redzēsiet šādu izvadi.

Izeja:

some kind of a useless lambda

Tagad tiek saukta lambda, un virkne, kurai mēs nododamies, tiek drukāta konsolē. Bet kāda ir šī dīvainā sintakse, un kāpēc lambda definīcija ir iekavās? Sapratīsim to tagad.

Kods Paskaidrojums

  1. Šeit ir tā pati virkne, kuru mēs definējām iepriekšējā piemērā.
  2. Šajā daļā mēs definējam lambda un nekavējoties to saucam, nododot virkni kā argumentu. To sauc par IIFE, un jūs uzzināsiet vairāk par to šīs apmācības nākamajās sadaļās.

4. piemērs

Apskatīsim pēdējo piemēru, lai saprastu, kā tiek izpildītas lambdas un regulārās funkcijas. Tātad, atveriet savu IDLE un jaunā failā ierakstiet šo:

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

Tagad saglabājiet failu un nospiediet taustiņu F5, lai palaistu programmu. Ja jūs nepieļāvāt kļūdas, izvadei vajadzētu būt apmēram šādai.

Izeja:

printeris 1 REGULAR CALL

printeris 2 REGULAR CALL

printeris 1 LAMBDA CALL

printeris 2 LAMBDA CALL

Kods Paskaidrojums

  1. Funkcija, ko sauc par guru un kura kā pirmo parametru un visus citus argumentus seko tai kā cita funkcija.
  2. printeris_one ir vienkārša funkcija, kas izdrukā tam nodoto parametru un atdod to.
  3. printeris_divs ir līdzīgs printerim_viens, bet bez atgriešanās paziņojuma.
  4. Šajā daļā mēs kā parametrus izsaucam guru funkciju un nododam printera funkcijas un virkni.
  5. Šī ir sintakse, lai sasniegtu ceturto soli (ti, izsauktu guru funkciju), bet izmantojot lambdas.

Nākamajā sadaļā jūs uzzināsit, kā Python izmantot lambda funkcijas ar map (), reduc () un filtru () .

Izmantojot lambdas ar Python iebūvētajiem

Lambda funkcijas nodrošina elegantu un spēcīgu veidu, kā veikt darbības, izmantojot Python iebūvētās metodes. Tas ir iespējams, jo lambdas var nekavējoties atsaukt un nodot kā argumentu šīm funkcijām.

IIFE Python Lambda

IIFE nozīmē tūlīt izsauktu funkciju izpildi. Tas nozīmē, ka lambda funkcija ir izsaucama, tiklīdz tā ir definēta. Sapratīsim to ar piemēru; aktivizējiet savu IDLE un ierakstiet šo:

 (lambda x: x + x)(2) 

Šeit ir izvades un koda skaidrojums:

Šī lambdas spēja nekavējoties tikt izmantota, ļauj tos izmantot tādās funkcijās kā karte () un samazināt (). Tas ir noderīgi, jo, iespējams, vairs nevēlaties izmantot šīs funkcijas.

lambdas filtrā ()

Filtrēšanas funkciju izmanto, lai atlasītu dažus konkrētus elementus no elementu secības. Secība var būt jebkurš atkārtotājs, piemēram, saraksti, kopas, kopas utt.

Elementi, kas tiks izvēlēti, ir balstīti uz dažiem iepriekš noteiktiem ierobežojumiem. Tam nepieciešami 2 parametri:

  • Funkcija, kas nosaka filtrēšanas ierobežojumu
  • Secība (jebkurš atkārtotājs, piemēram, saraksti, kopas utt.)

Piemēram,

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

Lūk, izeja:

[10, 8, 7, 5, 11]

Koda skaidrojums:

1. Pirmajā paziņojumā mēs definējam sarakstu, ko sauc par sekvencēm un kurā ir daži skaitļi.

2. Šeit mēs deklarējam mainīgo, ko sauc par filtered_result, kurš glabās filtrētās vērtības, kuras atgrieza funkcija filter ().

3. Lambda funkcija, kas darbojas katrā saraksta elementā un atgriež vērtību true, ja tā ir lielāka par 4.

4. Izdrukājiet filtra funkcijas atgriezto rezultātu.

lambdas kartē ()

kartes funkcija tiek izmantota, lai katram secības elementam piemērotu noteiktu darbību. Tāpat kā filtram (), tam ir nepieciešami arī 2 parametri:

  1. Funkcija, kas nosaka op, kas jāveic elementiem
  2. Viena vai vairākas secības

Piemēram, šeit ir programma, kas izdrukā skaitļu kvadrātus dotajā sarakstā:

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

Izeja:

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

[KR1]

Koda skaidrojums:

  1. Šeit mēs definējam sarakstu, ko sauc par sekvencēm, kurā ir daži skaitļi.
  2. Mēs deklarējam mainīgo ar nosaukumu filtered_result, kas glabā kartētās vērtības
  3. Lambda funkcija, kas darbojas uz katra saraksta elementa un atgriež šī skaitļa kvadrātu.
  4. Izdrukājiet kartes funkcijas atgriezto rezultātu.

lambdas mazinātājā ()

Samazināšanas funkciju, piemēram, map (), izmanto, lai operāciju piemērotu katram secības elementam. Tomēr tas atšķiras no kartes ar savu darbību. Lai aprēķinātu izvadi, seko funkcijai samazināt ():

1. solis) Veiciet noteikto darbību ar pirmajiem 2 secības elementiem.

2. darbība. Saglabājiet šo rezultātu

3. solis) Veiciet darbību ar saglabāto rezultātu un nākamo elementu secībā.

4. darbība. Atkārtojiet, līdz vairs nav elementu.

Tam nepieciešami arī divi parametri:

  1. Funkcija, kas nosaka veicamo darbību
  2. Secība (jebkurš atkārtotājs, piemēram, saraksti, kopas utt.)

Piemēram, šeit ir programma, kas atgriež visu saraksta elementu reizinājumu:

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

Šeit ir izeja:

120

Koda skaidrojums:

  1. Importa samazināšana no functools moduļa
  2. Šeit mēs definējam sarakstu, ko sauc par sekvencēm, kurā ir daži skaitļi.
  3. Mēs deklarējam mainīgo, ko sauc par produktu, kurā tiks saglabāta samazinātā vērtība
  4. Lambda funkcija, kas darbojas katrā saraksta elementā. Tas atgriezīs šī skaitļa reizinājumu atbilstoši iepriekšējam rezultātam.
  5. Izdrukājiet rezultātu, ko nodrošina funkcija samazināt.

Kāpēc (un kāpēc ne) izmantot lambda funkcijas?

Kā redzēsit nākamajā sadaļā, tulku līmenī pret lambdām izturas tāpat kā pret parastajām funkcijām. Savā ziņā jūs varētu teikt, ka lambdas nodrošina kompaktu sintaksi tādu funkciju rakstīšanai, kas atgriež vienu izteiksmi.

Tomēr jums jāzina, kad ir laba ideja lietot lambdas un kad no tām izvairīties. Šajā sadaļā jūs uzzināsiet dažus dizaina principus, ko python izstrādātāji izmanto, rakstot lambdas.

Viens no visbiežāk izmantotajiem lambdas gadījumiem ir funkcionālā programmēšana, jo Python atbalsta programmēšanas paradigmu (vai stilu), kas pazīstama kā funkcionālā programmēšana.

Tas ļauj jums nodrošināt funkciju kā parametru citai funkcijai (piemēram, kartē, filtrā utt.). Šādos gadījumos lambdas izmantošana piedāvā elegantu veidu, kā izveidot vienreizēju funkciju un nodot to kā parametru.

Kad nevajadzētu lietot Lambda?

Nekad nevajadzētu rakstīt sarežģītas lambda funkcijas ražošanas vidē. Kodētājiem, kuri uztur jūsu kodu, būs ļoti grūti to atšifrēt. Ja jums rodas sarežģītas vienas līnijas izteiksmes, pareizas funkcijas noteikšana būtu daudz pārāka. Kā labāko praksi jums jāatceras, ka vienkāršs kods vienmēr ir labāks par sarežģītu kodu.

Lambdas pret regulārajām funkcijām

Kā jau iepriekš teikts, lambdas ir [vV4] [J5] tikai funkcijas, kurām nav piesaistīts identifikators. Vienkāršāk sakot, tās ir funkcijas bez nosaukumiem (tātad anonīmi). Šeit ir tabula, lai ilustrētu atšķirību starp lambdas un parastajām funkcijām pitonā.

Lambdas

Regulāras funkcijas

Sintakse:

lambda x : x + x 

Sintakse:

def (x) :return x + x

Lambda funkciju ķermenī var būt tikai viena izteiksme.

Regulāru funkciju ķermenī var būt vairākas izteiksmes un paziņojumi.

Lambdas ar viņiem nav saistīts vārds. Tāpēc tās sauc arī par anonīmām funkcijām.

Parastajām funkcijām jābūt nosaukumam un parakstam.

Lambdas nesatur atgriešanās paziņojumu, jo pamatteksts tiek automātiski atgriezts.

Funkcijās, kurām jāatdod vērtība, jāietver atgriešanās paziņojums.

Atšķirību skaidrojums?

Primārā atšķirība starp lambda un regulāro funkciju ir tāda, ka lambda funkcija novērtē tikai vienu izteiksmi un dod funkcijas objektu. Līdz ar to mēs varam nosaukt lambda funkcijas rezultātu un izmantot to savā programmā, kā to darījām iepriekšējā piemērā.

Iepriekšminētā piemēra regulārā funkcija varētu izskatīties šādi:

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

Šeit mums ir jādefinē funkcijas nosaukums , kas atgriež rezultātu, kad to saucam . Funkcijā lambda nav atgriešanās priekšraksta, jo tai būs tikai viena izteiksme, kas vienmēr tiek atgriezta pēc noklusējuma. Jums pat nav jāpiešķir lambda, jo to var uzreiz izsaukt (skat. Nākamo sadaļu). Kā redzēsit nākamajā piemērā, lambdas kļūst īpaši spēcīgas, ja tās izmantojam ar Python iebūvētajām funkcijām.

Tomēr jūs joprojām varat domāt, kā lambdas atšķiras no funkcijas, kas atgriež vienu izteicienu (piemēram, iepriekš minēto). Tulka līmenī nav lielas atšķirības. Tas var izklausīties pārsteidzoši, taču tulka tulks izturas pret jebkuru lambda funkciju, kuru jūs definējat Python.

Kā redzat diagrammā, abas definīcijas pitona tulks apstrādā vienādi, pārvēršot to baitkodā. Tagad jūs nevarat nosaukt funkciju lambda, jo to ir rezervējis Python, bet jebkurš cits funkcijas nosaukums iegūs to pašu baitkodu [KR6].

Kopsavilkums

  • Lambdas, kas pazīstamas arī kā anonīmas funkcijas, ir mazas, ierobežotas funkcijas, kurām nav nepieciešams nosaukums (ti, identifikators).
  • Katrai lambda funkcijai Python ir 3 būtiskas daļas:
  • Lambda atslēgvārds.
  • Parametri (vai piesaistītie mainīgie) un
  • Funkcijas ķermenis.
  • Lambda rakstīšanas sintakse ir: lambda parametrs: izteiksme
  • Lambdas parametriem var būt jebkurš skaits, taču tie nav iekļauti bikšturos
  • Lambda funkcijas ķermenī var būt tikai 1 izteiksme, kas pēc noklusējuma tiek atgriezta.
  • Baitkodu līmenī nav lielas atšķirības starp to, kā tulks apstrādā lambdas un parastās funkcijas.
  • Lambdas atbalsta IIFE, izmantojot šo sintaksi: (lambda parametrs: izteiksme) (arguments)
  • Lambdas parasti lieto kopā ar šādiem iebūvētiem pitonu veidiem:
  • Filtrs: filtrs (lambda parametrs: izteiksme, iterējama secība)
  • Karte: karte (lambda parametrs: izteiksme, iterējamas sekvences)
  • Samazināt: samazināt (lambda parametrs1, parametrs2: izteiksme, iterējama secība)
  • Nerakstiet sarežģītas lambda funkcijas ražošanas vidē, jo kodu uzturētājiem būs grūti.

[J5] Esmu pievienojis tabulu, taču skaidrojums ir nepieciešams, lai saprastu atšķirības.