Python Lambdafunktioner med EKSEMPLER

Hvad er Lambda-funktionen i Python?

A Lambda funktion i Python programmering er en anonym funktion eller en funktion uden navn. Det er en lille og begrรฆnset funktion, der ikke har mere end รฉn linje. Ligesom en normal funktion kan en Lambda-funktion have flere argumenter med รฉt udtryk.

In Python, bruges lambda-udtryk (eller lambda-former) til at konstruere anonyme funktioner. For at gรธre det skal du bruge lambda sรธgeord (ligesom du bruger def for at definere normale funktioner). Hver anonym funktion, du definerer i Python vil have 3 vรฆsentlige dele:

  • Lambda nรธgleordet.
  • Parametrene (eller bundne variabler), og
  • Funktionslegemet.

En lambda-funktion kan have et hvilket som helst antal parametre, men funktionslegemet kan kun indeholde en udtryk. Desuden er en lambda skrevet i en enkelt kodelinje og kan ogsรฅ aktiveres med det samme. Du vil se alt dette i aktion i de kommende eksempler.

Syntaks og eksempler

Den formelle syntaks til at skrive en lambda-funktion er som angivet nedenfor:

lambda p1, p2: expression

Her er p1 og p2 de parametre, som sendes til lambda-funktionen. Du kan tilfรธje sรฅ mange eller fรฅ parametre, som du har brug for.

Bemรฆrk dog, at vi ikke bruger parenteser omkring parametrene, som vi gรธr med almindelige funktioner. Den sidste del (udtryk) er ethvert gyldigt pythonudtryk, der opererer pรฅ de parametre, du angiver til funktionen.

Eksempel 1

Nu hvor du kender til lambdas, lad os prรธve det med et eksempel. Sรฅ รฅben din IDLE og indtast fรธlgende:

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

Her er output:

3

Kode Forklaring

Her definerer vi en variabel, der vil holde resultatet returneret af lambda-funktionen.

1. Nรธgleordet lambda bruges til at definere en anonym funktion.

2. x og y er de parametre, som vi overfรธrer til lambda-funktionen.

3. Dette er kroppen af โ€‹โ€‹funktionen, som tilfรธjer de 2 parametre, vi har passeret. Bemรฆrk, at det er et enkelt udtryk. Du kan ikke skrive flere udsagn i kroppen af โ€‹โ€‹en lambda-funktion.

4. Vi kalder funktionen og udskriver den returnerede vรฆrdi.

Eksempel 2

Det var et grundlรฆggende eksempel pรฅ at forstรฅ lambdas grundlรฆggende principper og syntaks. Lad os nu prรธve at printe en lambda ud og se resultatet. ร…bn igen din IDLE og indtast fรธlgende:

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

Gem nu din fil og tryk pรฅ F5 for at kรธre programmet. Dette er det output, du skal fรฅ.

Output:

<function <lambda> at 0x00000185C3BF81E0>

Hvad sker der her? Lad os se pรฅ koden for at forstรฅ yderligere.

Kode Forklaring

  1. Her definerer vi en streng som du vil videregive som en parameter til lambdaen.
  2. Vi erklรฆrer en lambda, der kalder en print-erklรฆring og udskriver resultatet.

Men hvorfor udskriver programmet ikke den streng, vi passerer? Dette skyldes, at lambdaen selv returnerer et funktionsobjekt. I dette eksempel bliver lambdaen ikke kaldet ved printfunktionen, men ganske enkelt vender tilbage funktionsobjektet og hukommelsesstedet, hvor det er gemt. Det er det, der bliver udskrevet pรฅ konsollen.

Eksempel 3

Men hvis du skriver et program som dette:

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

Og kรธr det ved at trykke pรฅ F5, du vil se et output som dette.

Output:

some kind of a useless lambda

Nu bliver lambdaen kaldt, og den streng, vi passerer, bliver trykt ved konsollen. Men hvad er den mรฆrkelige syntaks, og hvorfor er lambda-definitionen dรฆkket i parentes? Lad os forstรฅ det nu.

Kode Forklaring

  1. Her er den samme streng, som vi definerede i det foregรฅende eksempel.
  2. I denne del definerer vi en lambda og kalder den straks ved at sende strengen som et argument. Dette er noget, der kaldes en IIFE, og du vil lรฆre mere om det i de kommende afsnit af denne รธvelse.

Eksempel 4

Lad os se pรฅ et sidste eksempel for at forstรฅ, hvordan lambdaer og almindelige funktioner udfรธres. Sรฅ รฅben din IDLE og indtast fรธlgende i en ny fil:

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

Gem nu filen og tryk pรฅ F5 for at kรธre programmet. Hvis du ikke lavede nogen fejl, skulle outputtet vรฆre noget som dette.

Output:

printer 1 REGULAR CALL

printer 2 REGULAR CALL

printer 1 LAMBDA CALL

printer 2 LAMBDA CALL

Kode Forklaring

  1. En funktion kaldet guru, der tager en anden funktion som den fรธrste parameter og eventuelle andre argumenter efter den.
  2. printer_one er en simpel funktion, som udskriver den parameter, der er sendt til den, og returnerer den.
  3. printer_two ligner printer_one, men uden returneringserklรฆringen.
  4. I denne del kalder vi guru-funktionen og sender printerfunktionerne og en streng som parametre.
  5. Dette er syntaksen for at opnรฅ det fjerde trin (dvs. kalde guru-funktionen), men ved at bruge lambdas.

I nรฆste afsnit lรฆrer du, hvordan du bruger lambda-funktioner med kort(), reducere(), og filter() in Python.

Bruger lambdas med Python indbyggede

Lambda-funktioner giver en elegant og kraftfuld mรฅde at udfรธre operationer ved hjรฆlp af indbyggede metoder Python. Det er muligt, fordi lambdas kan pรฅberรฅbes med det samme og sendes som et argument til disse funktioner.

IIFE ind Python Lambda

IIFE stรฅr for รธjeblikkeligt pรฅkaldt funktionsudfรธrelse. Det betyder, at en lambda-funktion kan kaldes, sรฅ snart den er defineret. Lad os forstรฅ dette med et eksempel; fyr op for din IDLE og indtast fรธlgende:

 (lambda x: x + x)(2)

Her er output- og kodeforklaringen:

Denne lambdas evne til at blive pรฅberรฅbt med det samme giver dig mulighed for at bruge dem i funktioner som map() og reduce(). Det er nyttigt, fordi du mรฅske ikke รธnsker at bruge disse funktioner igen.

lambdas i filter()

Filterfunktionen bruges til at vรฆlge nogle bestemte elementer fra en sekvens af elementer. Sekvensen kan vรฆre enhver iterator som lister, sรฆt, tupler osv.

De elementer, der vil blive valgt, er baseret pรฅ en foruddefineret begrรฆnsning. Det krรฆver 2 parametre:

  • En funktion, der definerer filtreringsbegrรฆnsningen
  • En sekvens (enhver iterator som lister, tupler osv.)

For eksempel:

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

Her er output:

[10, 8, 7, 5, 11]

Kodeforklaring:

1. I den fรธrste sรฆtning definerer vi en liste kaldet sekvenser, som indeholder nogle tal.

2. Her erklรฆrer vi en variabel kaldet filtered_result, som gemmer de filtrerede vรฆrdier, der returneres af filter()-funktionen.

3. En lambda-funktion, der kรธrer pรฅ hvert element pรฅ listen og returnerer sand, hvis den er stรธrre end 4.

4. Udskriv resultatet returneret af filterfunktionen.

lambdas pรฅ kort()

kortfunktionen bruges til at anvende en bestemt operation pรฅ hvert element i en sekvens. Ligesom filter() tager det ogsรฅ 2 parametre:

  1. En funktion, der definerer den operation, der skal udfรธres pรฅ elementerne
  2. En eller flere sekvenser

For eksempel er her et program, der udskriver kvadraterne af tal i en given liste:

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

Output:

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

[KR1]

Kodeforklaring:

  1. Her definerer vi en liste kaldet sekvenser, som indeholder nogle tal.
  2. Vi erklรฆrer en variabel kaldet filtered_result, som gemmer de tilknyttede vรฆrdier
  3. En lambda-funktion, som kรธrer pรฅ hvert element i listen og returnerer kvadratet af det tal.
  4. Udskriv resultatet returneret af kortfunktionen.

lambdas i reducere()

Reduceringsfunktionen, som map(), bruges til at anvende en operation pรฅ hvert element i en sekvens. Det adskiller sig dog fra kortet i sin funktion. Dette er trinene efterfulgt af reduce()-funktionen for at beregne et output:

Trin 1) Udfรธr den definerede operation pรฅ de fรธrste 2 elementer i sekvensen.

Trin 2) Gem dette resultat

Trin 3) Udfรธr operationen med det gemte resultat og det nรฆste element i sekvensen.

Trin 4) Gentag indtil der ikke er flere elementer tilbage.

Det krรฆver ogsรฅ to parametre:

  1. En funktion, der definerer den operation, der skal udfรธres
  2. En sekvens (enhver iterator som lister, tupler osv.)

For eksempel er her et program, der returnerer produktet af alle elementer pรฅ en liste:

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

Her er output:

120

Kodeforklaring:

  1. Importer reducere fra functools-modulet
  2. Her definerer vi en liste kaldet sekvenser, som indeholder nogle tal.
  3. Vi erklรฆrer en variabel kaldet produkt, som vil gemme den reducerede vรฆrdi
  4. En lambda-funktion, der kรธrer pรฅ hvert element pรฅ listen. Det vil returnere produktet af dette nummer som i det forrige resultat.
  5. Udskriv resultatet returneret af reduceringsfunktionen.

Hvorfor (og hvorfor ikke) bruge lambda-funktioner?

Som du vil se i nรฆste afsnit, behandles lambdaer pรฅ samme mรฅde som almindelige funktioner pรฅ tolkeniveau. Pรฅ en mรฅde kan man sige, at lambdas giver en kompakt syntaks til at skrive funktioner, der returnerer et enkelt udtryk.

Du bรธr dog vide, hvornรฅr det er en god idรฉ at bruge lambdas, og hvornรฅr du skal undgรฅ dem. I dette afsnit lรฆrer du nogle af de designprincipper, som python-udviklere bruger, nรฅr de skriver lambdaer.

En af de mest almindelige use cases for lambdaer er i funktionel programmering som Python understรธtter et paradigme (eller stil) af programmering kendt som funktionel programmering.

Det giver dig mulighed for at levere en funktion som en parameter til en anden funktion (for eksempel i kort, filter osv.). I sรฅdanne tilfรฆlde tilbyder lambdaer en elegant mรฅde at oprette en engangsfunktion og videregive den som parameter.

Hvornรฅr bรธr du ikke bruge Lambda?

Du bรธr aldrig skrive komplicerede lambda-funktioner i et produktionsmiljรธ. Det vil vรฆre meget svรฆrt for kodere, der vedligeholder din kode, at dekryptere den. Hvis du finder dig selv i at lave komplekse one-liner udtryk, ville det vรฆre en meget overlegen praksis at definere en korrekt funktion. Som en bedste praksis skal du huske, at simpel kode altid er bedre end kompleks kode.

Lambdas vs. almindelige funktioner

Som tidligere nรฆvnt er lambdaer[vV4][J5] kun funktioner, som ikke har en identifikator bundet til sig. I enklere ord er de funktioner uden navne (derfor anonyme). Her er en tabel for at illustrere forskellen mellem lambdas og almindelige funktioner i python.

Lambdas

Almindelige funktioner

Syntaks:

lambda x : x + x

Syntaks:

def (x) :
return x + x 

Lambdafunktioner kan kun have รฉt udtryk i deres krop.

Regulรฆre funktioner kan have flere udtryk og udsagn i deres krop.

Lambdaer har ikke et navn forbundet med dem. Derfor er de ogsรฅ kendt som anonyme funktioner.

Almindelige funktioner skal have navn og signatur.

Lambdas indeholder ikke en returerklรฆring, fordi kroppen automatisk returneres.

Funktioner, der skal returnere vรฆrdi, bรธr omfatte en returerklรฆring.

Forklaring pรฅ forskellene?

Den primรฆre forskel mellem en lambda og en regulรฆr funktion er, at lambda-funktionen kun evaluerer et enkelt udtryk og giver et funktionsobjekt. Derfor kan vi navngive resultatet af lambda-funktionen og bruge det i vores program, som vi gjorde i det foregรฅende eksempel.

En almindelig funktion for ovenstรฅende eksempel ville se sรฅdan ud:

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

Her skal vi definere en navn for den funktion, som afkast resultatet nรฅr vi ringe det. En lambda-funktion indeholder ikke en return-sรฆtning, fordi den kun vil have et enkelt udtryk, som altid returneres som standard. Du behรธver ikke engang at tildele en lambda, da den straks kan pรฅberรฅbes (se nรฆste afsnit). Som du vil se i det fรธlgende eksempel, bliver lambdas sรฆrligt kraftfulde, nรฅr vi bruger dem sammen med Python's indbyggede funktioner.

Du kan dog stadig undre dig over, hvordan lambdas er anderledes end en funktion, der returnerer et enkelt udtryk (som det ovenfor). Pรฅ tolkeniveau er der ikke den store forskel. Det lyder mรฅske overraskende, men enhver lambda-funktion, som du definerer i Python behandles som en normal funktion af tolken.

Som du kan se i diagrammet, hรฅndteres de to definitioner pรฅ samme mรฅde af python-fortolkeren, nรฅr de konverteres til bytekode. Nu kan du ikke navngive en funktion lambda fordi det er reserveret af Python, men ethvert andet funktionsnavn vil give den samme bytekode[KR6].

Resumรฉ

  • Lambdaer, ogsรฅ kendt som anonyme funktioner, er smรฅ, begrรฆnsede funktioner, som ikke behรธver et navn (dvs. en identifikator).
  • Hver lambda-funktion i Python har 3 vรฆsentlige dele:
  • Lambda nรธgleordet.
  • Parametrene (eller bundne variabler), og
  • Funktionslegemet.
  • Syntaksen for at skrive en lambda er: lambda parameter: udtryk
  • Lambdaer kan have et hvilket som helst antal parametre, men de er ikke omgivet af seler
  • En lambda kan kun have 1 udtryk i sin funktions krop, som returneres som standard.
  • Pรฅ bytecode-niveau er der ikke meget forskel pรฅ, hvordan lambdas og almindelige funktioner hรฅndteres af tolken.
  • Lambdaer understรธtter IIFE gennem denne syntaks: (lambda parameter: udtryk) (argument)
  • Lambdaer bruges almindeligvis med fรธlgende python indbyggede:
  • Filter: filter (lambda parameter: udtryk, iterable-sequence)
  • Kort: kort (lambda-parameter: udtryk, iterable-sekvenser)
  • Reducer: reducer (lambda parameter1, parameter2: udtryk, iterable-sequence)
  • Skriv ikke komplicerede lambda-funktioner i et produktionsmiljรธ, da det vil vรฆre svรฆrt for kode-vedligeholdere.

[J5]Jeg har tilfรธjet en tabel, men forklaringen er nรธdvendig for at forstรฅ forskellene.

Opsummer dette indlรฆg med: