Python Lambdafunksjoner med EKSEMPLER
โก Smart oppsummering
Lambda-funksjoner i Python er smรฅ anonyme funksjoner definert med lambda-nรธkkelordet i stedet for def. De inneholder et enkelt uttrykk, tar imot et hvilket som helst antall argumenter og sendes ofte direkte til innebygde funksjoner som map(), filter() og sorted().

Hva er Lambda-funksjonen i Python?
A Lambdafunksjon i Python programmering er en anonym funksjon eller en funksjon uten navn. Det er en liten og begrenset funksjon som ikke har mer enn รฉn linje. Akkurat som en vanlig funksjon, kan en Lambda-funksjon ha flere argumenter med ett uttrykk.
In Python, lambda-uttrykk (eller lambda-former) brukes til รฅ konstruere anonyme funksjoner. For รฅ gjรธre det, bruker du lambda nรธkkelord (akkurat som du bruker def for รฅ definere normale funksjoner). Hver anonym funksjon du definerer i Python vil ha 3 viktige deler:
- Lambda-stikkordet.
- Parametrene (eller bundne variabler), og
- Funksjonskroppen.
En lambda-funksjon kan ha et hvilket som helst antall parametere, men funksjonskroppen kan bare inneholde en uttrykk. Dessuten er en lambda skrevet i en enkelt kodelinje og kan ogsรฅ pรฅkalles umiddelbart. Du vil se alt dette i aksjon i de kommende eksemplene.
Syntaks og eksempler
Den formelle syntaksen for รฅ skrive en lambda-funksjon er som gitt nedenfor:
lambda p1, p2: expression
Her er p1 og p2 parametrene som sendes til lambda-funksjonen. Du kan legge til sรฅ mange eller fรฅ parametere du trenger.
Merk imidlertid at vi ikke bruker parenteser rundt parameterne slik vi gjรธr med vanlige funksjoner. Den siste delen (uttrykket) er et hvilket som helst gyldig Python uttrykk som opererer pรฅ parametrene du oppgir til funksjonen.
Eksempel 1
Nรฅ som du vet om lambda, la oss prรธve det med et eksempel. Sรฅ รฅpne din IDLE og skriv inn fรธlgende:
adder = lambda x, y: x + y print (adder (1, 2))
Code Forklaring
Her definerer vi en variabel som vil holde resultatet returnert av lambda-funksjonen.
1. Lambda-nรธkkelordet som brukes til รฅ definere en anonym funksjon.
2. x og y er parameterne som vi sender til lambda-funksjonen.
3. Dette er hoveddelen av funksjonen, som legger til de 2 parameterne vi passerte. Legg merke til at det er et enkelt uttrykk. Du kan ikke skrive flere utsagn i kroppen til en lambda-funksjon.
4. Vi kaller funksjonen og skriver ut den returnerte verdien.
Eksempel 2
Det var et grunnleggende eksempel for รฅ forstรฅ det grunnleggende og syntaksen til lambda. La oss nรฅ prรธve รฅ skrive ut en lambda og se resultatet. ร pne igjen IDLE og skriv inn fรธlgende:
#What a lambda returns string='some kind of a useless lambda' print(lambda string : print(string))
Lagre nรฅ filen og trykk F5 for รฅ kjรธre programmet. Dette er utgangen du bรธr fรฅ.
Utgang:
<function <lambda> at 0x00000185C3BF81E0>
Hva skjer her? La oss se pรฅ koden for รฅ forstรฅ det bedre.
Code Forklaring:
1. Her definerer vi en string som du vil sende som en parameter til lambdaen.
2. Vi deklarerer en lambda som kaller en print-setning og skriver ut resultatet.
Men hvorfor skriver ikke programmet ut strengen vi sender? Dette er fordi lambda-verdien i seg selv returnerer et funksjonsobjekt. I dette eksemplet blir ikke lambda-verdien som heter av utskriftsfunksjonen, men er ganske enkelt retur funksjonsobjektet og minneplasseringen der det er lagret. Det er det som skrives ut i 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 kjรธr den ved รฅ trykke F5, sรฅ fรฅr du opp en utdata som dette.
Utgang:
some kind of a useless lambda
Nรฅ kalles lambdaen, og strengen vi sender skrives ut i konsollen. Men hva er den rare syntaksen, og hvorfor er lambda-definisjonen dekket i parentes? La oss forstรฅ det nรฅ.
Code Forklaring:
1. Her er den samme strengen som vi definerte i forrige eksempel.
2. I denne delen definerer vi en lambda og kaller den umiddelbart ved รฅ sende strengen som et argument. Dette kalles en IIFE, og du vil lรฆre mer om det i de kommende delene av denne veiledningen.
Eksempel 4
La oss se pรฅ et siste eksempel for รฅ forstรฅ hvordan lambdaer og vanlige funksjoner utfรธres. Sรฅ, รฅpne din IDLE og i en ny fil, skriv inn fรธlgende:
#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'))
Lagre nรฅ filen og trykk F5 for รฅ kjรธre programmet. Hvis du ikke har gjort noen feil, skal resultatet vรฆre omtrent slik.
Utgang:
printer 1 REGULAR CALL printer 2 REGULAR CALL printer 1 LAMBDA CALL printer 2 LAMBDA CALL
Code Forklaring:
1. En funksjon kalt guru som tar en annen funksjon som den fรธrste parameteren og eventuelle andre argumenter som fรธlger den.
2. printer_one er en enkel funksjon som skriver ut parameteren som sendes til den og returnerer den.
3. printer_two er lik printer_one, men uten retursetningen.
4. I denne delen kaller vi guru-funksjonen og sender skriverfunksjonene og en streng som parametere.
5. Dette er syntaksen for รฅ oppnรฅ det fjerde trinnet (dvs. kalle guru-funksjonen), men ved bruk av lambdaer.
I neste avsnitt lรฆrer du hvordan du bruker lambda-funksjoner med kart(), redusere()og filter() in Python.
Bruker lambda med Python innebygde
Lambda-funksjoner gir en elegant og kraftig mรฅte รฅ utfรธre operasjoner ved hjelp av innebygde metoder Python. Det er mulig fordi lambdaer kan pรฅkalles umiddelbart og sendes som et argument til disse funksjonene.
IIFE inn Python Lambda
IIFE stรฅr for umiddelbart pรฅkalte funksjonsutfรธrelse. Det betyr at en lambda-funksjon kan kalles sรฅ snart den er definert. La oss forstรฅ dette med et eksempel; start opp IDLE og skriv inn fรธlgende:
(lambda x: x + x)(2)
Her er utdata- og kodeforklaringen:
Denne muligheten til lambdaer รฅ bli pรฅkalt umiddelbart lar deg bruke dem i funksjoner som map() og reduce(). Det er nyttig fordi du kanskje ikke vil bruke disse funksjonene igjen.
lambdas i filter()
Filterfunksjonen brukes til รฅ velge enkelte elementer fra en sekvens av elementer. Sekvensen kan vรฆre hvilken som helst iterator som lister, sett, tupler, etc.
Elementene som blir valgt er basert pรฅ en forhรฅndsdefinert begrensning. Det kreves to parametere:
- En funksjon som definerer filtreringsbegrensningen
- 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 utgangen:
[10, 8, 7, 5, 11]
Code Forklaring:
1. I den fรธrste setningen definerer vi en liste kalt sekvenser som inneholder noen tall.
2. Her erklรฆrer vi en variabel kalt filtered_result, som vil lagre de filtrerte verdiene som returneres av filter()-funksjonen.
3. En lambda-funksjon som kjรธrer pรฅ hvert element i listen og returnerer sann hvis den er stรธrre enn 4.
4. Skriv ut resultatet returnert av filterfunksjonen.
lambdas i kart()
Map-funksjonen brukes til รฅ utfรธre en bestemt operasjon pรฅ hvert element i en sekvens. I likhet med filter() tar den ogsรฅ to parametere:
- En funksjon som definerer operasjonen som skal utfรธres pรฅ elementene
- En eller flere sekvenser
For eksempel, her er et program som skriver ut kvadratene av tall i en gitt liste:
sequences = [10,2,8,7,5,4,3,11,0, 1] filtered_result = map (lambda x: x*x, sequences) print(list(filtered_result))
Utgang:
[100, 4, 64, 49, 25, 16, 9, 121, 0, 1]
Code Forklaring:
1. Her definerer vi en liste kalt sekvenser som inneholder noen tall.
2. Vi deklarerer en variabel kalt filtered_result som vil lagre de tilordnede verdiene.
3. En lambda-funksjon som kjรธrer pรฅ hvert element i listen og returnerer kvadratet av det tallet.
4. Skriv ut resultatet som returneres av kartfunksjonen.
lambdas i redusere()
Reduseringsfunksjonen, som map(), brukes til รฅ bruke en operasjon pรฅ hvert element i en sekvens. Imidlertid skiller det seg fra kartet i sin virkemรฅte. Dette er trinnene etterfulgt av reduce()-funksjonen for รฅ beregne en utdata:
Trinn 1) Utfรธr den definerte operasjonen pรฅ de to fรธrste elementene i sekvensen.
Trinn 2) Lagre dette resultatet.
Trinn 3) Utfรธr operasjonen med det lagrede resultatet og neste element i sekvensen.
Trinn 4) Gjenta til det ikke er flere elementer igjen.
Det krever ogsรฅ to parametere:
- En funksjon som definerer operasjonen som skal utfรธres
- En sekvens (enhver iterator som lister, tupler osv.)
For eksempel, her er et program som returnerer produktet av alle elementene i en liste:
from functools import reduce sequences = [1,2,3,4,5] product = reduce (lambda x, y: x*y, sequences) print(product)
Her er utgangen:
120
Code Forklaring:
1. Importer reduce fra functools-modulen.
2. Her definerer vi en liste kalt sekvenser som inneholder noen tall.
3. Vi deklarerer en variabel kalt produkt som vil lagre den reduserte verdien.
4. En lambda-funksjon som kjรธrer pรฅ hvert element i listen. Den vil returnere produktet av det tallet i henhold til forrige resultat.
5. Skriv ut resultatet som returneres av reduce-funksjonen.
Hvorfor (og hvorfor ikke) bruke lambda-funksjoner?
Som du vil se i neste avsnitt, behandles lambdaer pรฅ samme mรฅte som vanlige funksjoner pรฅ tolknivรฅ. Pรฅ en mรฅte kan du si at lambdaer gir kompakt syntaks for รฅ skrive funksjoner som returnerer et enkelt uttrykk.
Du bรธr imidlertid vite nรฅr det er lurt รฅ bruke lambdaer og nรฅr du bรธr unngรฅ dem. I denne delen lรฆrer du noen av designprinsippene som brukes av Python utviklere nรฅr de skriver lambdaer.
Et av de vanligste bruksomrรฅdene for lambdaer er i funksjonell programmering, som Python stรธtter et paradigme (eller stil) for programmering kjent som funksjonell programmering.
Den lar deg gi en funksjon som en parameter til en annen funksjon (for eksempel i kart, filter osv.). I slike tilfeller tilbyr bruk av lambdaer en elegant mรฅte รฅ opprette en engangsfunksjon og sende den som parameter.
Nรฅr bรธr du ikke bruke Lambda?
Du bรธr aldri skrive kompliserte lambdafunksjoner i et produksjonsmiljรธ. Det vil vรฆre svรฆrt vanskelig for kodere som vedlikeholder koden din รฅ dekryptere den. Hvis du finner deg selv i รฅ lage komplekse one-liner-uttrykk, ville det vรฆre en mye overlegen praksis รฅ definere en riktig funksjon. Som en beste praksis mรฅ du huske at enkel kode alltid er bedre enn kompleks kode.
Lambdas vs. vanlige funksjoner
Som tidligere nevnt er lambdaer bare funksjoner som ikke har en identifikator bundet til seg. Enklere sagt er de funksjoner uten navn (derav anonyme). Her er en tabell som illustrerer forskjellen mellom lambdaer og vanlige funksjoner i Python.
| Lambdas | Vanlige funksjoner |
|---|---|
Syntaks:
lambda x : x + x
|
Syntaks:
def (x) : return x + x |
| Lambdafunksjoner kan bare ha ett uttrykk i kroppen. | Regulรฆre funksjoner kan ha flere uttrykk og utsagn i kroppen. |
| Lambdaer har ikke noe navn knyttet til seg. Det er derfor de ogsรฅ er kjent som anonyme funksjoner. | Vanlige funksjoner mรฅ ha navn og signatur. |
| Lambdas inneholder ikke en returerklรฆring fordi kroppen automatisk returneres. | Funksjoner som mรฅ returnere en verdi, bรธr inneholde en return-setning. |
Forklaring av forskjellene
Den primรฆre forskjellen mellom en lambda- og en vanlig funksjon er at lambda-funksjonen kun evaluerer et enkelt uttrykk og gir et funksjonsobjekt. Fรธlgelig kan vi navngi resultatet av lambda-funksjonen og bruke den i programmet vรฅrt som vi gjorde i forrige eksempel.
En vanlig funksjon for eksemplet ovenfor vil se slik ut:
def adder (x, y): return x + y print (adder (1, 2))
Her mรฅ vi definere en navn for funksjonen som avkastning resultatet nรฅr vi ring den. En lambda-funksjon inneholder ikke en retursetning fordi den bare vil ha ett enkelt uttrykk som alltid returneres som standard. Du trenger ikke engang รฅ tilordne en lambda heller, da den kan kalles umiddelbart (se forrige avsnitt). Som du vil se, blir lambdaer spesielt kraftige nรฅr vi bruker dem med Pythoninnebygde funksjoner.
Imidlertid lurer du kanskje fortsatt pรฅ hvordan lambdas er annerledes enn en funksjon som returnerer et enkelt uttrykk (som det ovenfor). Pรฅ tolknivรฅ er det ikke stor forskjell. Det hรธres kanskje overraskende ut, men hvilken som helst lambda-funksjon du definerer i Python behandles som en normal funksjon av tolken.
Pรฅ bytekodenivรฅ hรฅndteres de to definisjonene pรฅ samme mรฅte av Python tolk. Nรฅ kan du ikke navngi en funksjon lambda fordi den er reservert av Python, men ethvert annet funksjonsnavn vil gi samme bytekode.
