Python Lambdafunktioner med EXEMPEL

โšก Smart sammanfattning

Lambdafunktioner i Python รคr smรฅ anonyma funktioner definierade med nyckelordet lambda istรคllet fรถr def. De innehรฅller ett enda uttryck, tar emot valfritt antal argument och skickas ofta direkt till inbyggda funktioner som map(), filter() och sorted().

  • ๐Ÿ”‘ Lambda-nyckelord: En lambda skrivs som lambda-argument: uttryck, utan def, utan namn och utan explicit retursats.
  • ๐Ÿงฎ Enskilt uttryck: Kroppen innehรฅller exakt ett uttryck vars vรคrde returneras automatiskt, sรฅ satser och flera rader รคr inte tillรฅtna.
  • ๐Ÿ”— Inbyggd parkoppling: Lambdas skickas vanligtvis till map(), filter(), reduce() och sorted() fรถr att transformera eller vรคlja objekt i en sekvens.
  • โšก IIFE: En lambda kan definieras och anropas omedelbart med hjรคlp av mรถnstret (lambda x: x + x)(2), vilket returnerar ett resultat direkt.
  • โš–๏ธ Mot fรถrlust: Vanliga funktioner behรถver ett namn och kan innehรฅlla mรฅnga uttalanden, medan lambdas byter ut den kraften mot kompakt syntax pรฅ en rad.
  • ๐Ÿค– AI-hjรคlp: AI-assistenter som GitHub Copilot genererar lambda-uttryck fรถr mappnings-, filter- och sorteringsnycklar frรฅn en kort prompt.

Python Lambda-funktioner

Vad รคr Lambda-funktionen i Python?

A Lambdafunktion in Python programmering รคr en anonym funktion eller en funktion utan namn. Det รคr en liten och begrรคnsad funktion som inte har mer รคn en rad. Precis som en normal funktion kan en Lambda-funktion ha flera argument med ett uttryck.

In Python, anvรคnds lambda-uttryck (eller lambda-former) fรถr att konstruera anonyma funktioner. Fรถr att gรถra det anvรคnder du lambda nyckelord (precis som du anvรคnder def fรถr att definiera normala funktioner). Varje anonym funktion du definierar i Python kommer att ha 3 viktiga delar:

  • Lambda nyckelordet.
  • Parametrarna (eller bundna variabler), och
  • Funktionskroppen.

En lambdafunktion kan ha hur mรฅnga parametrar som helst, men funktionskroppen kan bara innehรฅlla ett uttryck. Dessutom skrivs en lambda i en enda kodrad och kan รคven anropas omedelbart. Du kommer att se allt detta i aktion i de kommande exemplen.

Syntax och exempel

Den formella syntaxen fรถr att skriva en lambdafunktion รคr enligt nedan:

lambda p1, p2: expression

Hรคr รคr p1 och p2 parametrarna som skickas till lambdafunktionen. Du kan lรคgga till sรฅ mรฅnga eller fรฅ parametrar som du behรถver.

Observera dock att vi inte anvรคnder parenteser runt parametrarna som vi gรถr med vanliga funktioner. Den sista delen (uttrycket) รคr valfritt giltigt Python uttryck som arbetar pรฅ de parametrar du anger i funktionen.

Exempelvis 1

Nu nรคr du kรคnner till lambdas lรฅt oss prova det med ett exempel. Sรฅ รถppna din IDLE och skriv in fรถljande:

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

Code Fรถrklaring

Hรคr definierar vi en variabel som kommer att hรฅlla resultatet som returneras av lambda-funktionen.

1. Nyckelordet lambda anvรคnds fรถr att definiera en anonym funktion.

2. x och y รคr parametrarna som vi skickar till lambdafunktionen.

3. Detta รคr huvuddelen av funktionen, som lรคgger till de 2 parametrarna vi skickade. Lรคgg mรคrke till att det รคr ett enda uttryck. Du kan inte skriva flera pรฅstรฅenden i kroppen av en lambdafunktion.

4. Vi anropar funktionen och skriver ut det returnerade vรคrdet.

Exempelvis 2

Det var ett enkelt exempel fรถr att fรถrstรฅ grunderna och syntaxen fรถr lambda. Lรฅt oss nu fรถrsรถka skriva ut en lambda och se resultatet. ร–ppna din [fil] igen. IDLE och skriv in fรถljande:

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

Spara nu din fil och tryck pรฅ F5 fรถr att kรถra programmet. Det hรคr รคr resultatet du bรถr fรฅ.

Produktion:

<function <lambda> at 0x00000185C3BF81E0>

Vad hรคnder hรคr? Lรฅt oss titta pรฅ koden fรถr att fรถrstรฅ mer.

Code Fรถrklaring:

1. Hรคr definierar vi en strรคng som du kommer att skicka som en parameter till lambdan.

2. Vi deklarerar en lambda som anropar en print-sats och skriver ut resultatet.

Men varfรถr skriver inte programmet ut strรคngen vi skickar? Detta beror pรฅ att lambdan sjรคlv returnerar ett funktionsobjekt. I det hรคr exemplet anvรคnds inte lambdan. kallas av utskriftsfunktionen men รคr helt enkelt tillbaka funktionsobjektet och minnesplatsen dรคr det lagras. Det รคr det som skrivs ut i konsolen.

Exempelvis 3

Men om du skriver ett program som detta:

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

Och kรถr den genom att trycka pรฅ F5, sรฅ ser du en utdata som denna.

Produktion:

some kind of a useless lambda

Nu anropas lambdan och strรคngen vi skickar skrivs ut i konsolen. Men vad รคr den dรคr konstiga syntaxen, och varfรถr รคr lambdans definition tรคckt inom parenteser? Lรฅt oss fรถrstรฅ det nu.

Code Fรถrklaring:

1. Hรคr รคr samma strรคng som vi definierade i fรถregรฅende exempel.

2. I den hรคr delen definierar vi en lambda och anropar den omedelbart genom att skicka strรคngen som ett argument. Detta kallas en IIFE, och du kommer att lรคra dig mer om det i kommande avsnitt av den hรคr handledningen.

Exempelvis 4

Lรฅt oss titta pรฅ ett sista exempel fรถr att fรถrstรฅ hur lambdas och vanliga funktioner exekveras. Sรฅ, รถppna din IDLE och i en ny fil skriver du in fรถljande:

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

Spara nu filen och tryck pรฅ F5 fรถr att kรถra programmet. Om du inte gjorde nรฅgra misstag bรถr resultatet se ut ungefรคr sรฅ hรคr.

Produktion:

printer 1 REGULAR CALL

printer 2 REGULAR CALL

printer 1 LAMBDA CALL

printer 2 LAMBDA CALL

Code Fรถrklaring:

1. En funktion som heter guru som tar en annan funktion som fรถrsta parameter och eventuella andra argument som fรถljer pรฅ den.

2. printer_one รคr en enkel funktion som skriver ut parametern som skickats till den och returnerar den.

3. printer_two liknar printer_one men utan return-satsen.

4. I den hรคr delen anropar vi guru-funktionen och skickar skrivarfunktionerna och en strรคng som parametrar.

5. Detta รคr syntaxen fรถr att uppnรฅ det fjรคrde steget (dvs. anropa guru-funktionen) men med hjรคlp av lambdas.

I nรคsta avsnitt fรฅr du lรคra dig hur du anvรคnder lambdafunktioner med Karta(), minska()och filtrera() in Python.

Anvรคnder lambdas med Python inbyggda

Lambdafunktioner ger ett elegant och kraftfullt sรคtt att utfรถra operationer med hjรคlp av inbyggda metoder Python. Det รคr mรถjligt eftersom lambdas kan anropas omedelbart och skickas som ett argument till dessa funktioner.

IIFE in Python Lambda

IIFE stรฅr fรถr omedelbart anropade funktionsexekvering. Det betyder att en lambdafunktion รคr anropbar sรฅ snart den รคr definierad. Lรฅt oss fรถrstรฅ detta med ett exempel; starta din IDLE och skriv in fรถljande:

 (lambda x: x + x)(2)

Hรคr รคr utdata och kodfรถrklaring:

Denna fรถrmรฅga hos lambdas att anropas omedelbart gรถr att du kan anvรคnda dem i funktioner som map() och reduce(). Det รคr anvรคndbart eftersom du kanske inte vill anvรคnda dessa funktioner igen.

lambdas i filter()

Filterfunktionen anvรคnds fรถr att vรคlja vissa speciella element frรฅn en sekvens av element. Sekvensen kan vara vilken iterator som helst som listor, uppsรคttningar, tupler, etc.

Elementen som kommer att vรคljas baseras pรฅ en fรถrdefinierad begrรคnsning. Det krรคvs tvรฅ parametrar:

  • En funktion som definierar filtreringsbegrรคnsningen
  • En sekvens (valfri iterator som listor, tupler, etc.)

Till exempel,

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

Hรคr รคr utgรฅngen:

[10, 8, 7, 5, 11]

Code Fรถrklaring:

1. I det fรถrsta pรฅstรฅendet definierar vi en lista som kallas sekvenser som innehรฅller nรฅgra siffror.

2. Hรคr deklarerar vi en variabel som heter filtered_result, som kommer att lagra de filtrerade vรคrdena som returneras av filter()-funktionen.

3. En lambda-funktion som kรถrs pรฅ varje element i listan och returnerar sant om det รคr stรถrre รคn 4.

4. Skriv ut resultatet som returneras av filterfunktionen.

lambdas i kartan()

Map-funktionen anvรคnds fรถr att tillรคmpa en specifik operation pรฅ varje element i en sekvens. Precis som filter() tar den ocksรฅ tvรฅ parametrar:

  1. En funktion som definierar den operation som ska utfรถras pรฅ elementen
  2. En eller flera sekvenser

Till exempel, hรคr รคr ett program som skriver ut kvadraterna av siffror i en given lista:

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

Produktion:

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

Code Fรถrklaring:

1. Hรคr definierar vi en lista som kallas sekvenser och som innehรฅller nรฅgra tal.

2. Vi deklarerar en variabel som heter filtered_result som lagrar de mappade vรคrdena.

3. En lambdafunktion som kรถrs pรฅ varje element i listan och returnerar kvadraten av det talet.

4. Skriv ut resultatet som returneras av map-funktionen.

lambdas i reduce()

Reduceringsfunktionen, som map(), anvรคnds fรถr att tillรคmpa en operation pรฅ varje element i en sekvens. Den skiljer sig dock frรฅn kartan i sin funktion. Det hรคr รคr stegen som fรถljs av reduce()-funktionen fรถr att berรคkna en utdata:

Steg 1) Utfรถr den definierade operationen pรฅ de tvรฅ fรถrsta elementen i sekvensen.

Steg 2) Spara detta resultat.

Steg 3) Utfรถr operationen med det sparade resultatet och nรคsta element i sekvensen.

Steg 4) Upprepa tills inga fler element finns kvar.

Det krรคvs ocksรฅ tvรฅ parametrar:

  1. En funktion som definierar operationen som ska utfรถras
  2. En sekvens (valfri iterator som listor, tupler, etc.)

Till exempel, hรคr รคr ett program som returnerar produkten av alla element i en lista:

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

Hรคr รคr utgรฅngen:

120

Code Fรถrklaring:

1. Importera reduce frรฅn functools-modulen.

2. Hรคr definierar vi en lista som kallas sekvenser och som innehรฅller nรฅgra tal.

3. Vi deklarerar en variabel som heter produkt som lagrar det reducerade vรคrdet.

4. En lambdafunktion som kรถrs pรฅ varje element i listan. Den returnerar produkten av det talet enligt fรถregรฅende resultat.

5. Skriv ut resultatet som returneras av reduce-funktionen.

Varfรถr (och varfรถr inte) anvรคnda lambdafunktioner?

Som du kommer att se i nรคsta avsnitt behandlas lambdas pรฅ samma sรคtt som vanliga funktioner pรฅ tolknivรฅ. Pรฅ ett sรคtt kan man sรคga att lambdas ger kompakt syntax fรถr att skriva funktioner som returnerar ett enda uttryck.

Du bรถr dock veta nรคr det รคr en bra idรฉ att anvรคnda lambdas och nรคr du ska undvika dem. I det hรคr avsnittet kommer du att lรคra dig nรฅgra av de designprinciper som anvรคnds av Python utvecklare nรคr de skriver lambdas.

Ett av de vanligaste anvรคndningsomrรฅdena fรถr lambdas รคr inom funktionell programmering, eftersom Python stรถder ett paradigm (eller stil) av programmering som kallas funktionell programmering.

Det lรฅter dig ange en funktion som en parameter till en annan funktion (till exempel i map, filter, etc.). I sรฅdana fall erbjuder anvรคndningen av lambdas ett elegant sรคtt att skapa en engรฅngsfunktion och skicka den som parameter.

Nรคr ska du inte anvรคnda Lambda?

Du ska aldrig skriva komplicerade lambdafunktioner i en produktionsmiljรถ. Det kommer att vara mycket svรฅrt fรถr kodare som underhรฅller din kod att dekryptera den. Om du kommer pรฅ dig sjรคlv med att gรถra komplexa enkelriktade uttryck, skulle det vara en mycket รถverlรคgsen praxis att definiera en korrekt funktion. Som en bรคsta praxis mรฅste du komma ihรฅg att enkel kod alltid รคr bรคttre รคn komplex kod.

Lambdas kontra vanliga funktioner

Som tidigare nรคmnts รคr lambdas bara funktioner som inte har nรฅgon identifierare bunden till sig. Enklare uttryckt รคr de funktioner utan namn (dรคrav anonyma). Hรคr รคr en tabell som illustrerar skillnaden mellan lambdas och vanliga funktioner i Python.

Lambdas Vanliga funktioner
Syntax:

lambda x : x + x
Syntax:

def (x) :
return x + x 
Lambdafunktioner kan bara ha ett uttryck i sin kropp. Reguljรคra funktioner kan ha flera uttryck och uttalanden i kroppen.
Lambdas har inget namn associerat med sig. Det รคr dรคrfรถr de ocksรฅ kallas anonyma funktioner. Vanliga funktioner mรฅste ha namn och signatur.
Lambdas innehรฅller inget returmeddelande eftersom kroppen automatiskt returneras. Funktioner som behรถver returnera ett vรคrde bรถr innehรฅlla en return-sats.

Fรถrklaring av skillnaderna

Den primรคra skillnaden mellan en lambda och en vanlig funktion รคr att lambdafunktionen endast utvรคrderar ett enda uttryck och ger ett funktionsobjekt. Fรถljaktligen kan vi namnge resultatet av lambdafunktionen och anvรคnda den i vรฅrt program som vi gjorde i fรถregรฅende exempel.

En vanlig funktion fรถr exemplet ovan skulle se ut sรฅ hรคr:

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

Hรคr mรฅste vi definiera en namn fรถr den funktion som รฅtergรฅr resultatet nรคr vi Ring den. En lambda-funktion innehรฅller inte en retursats eftersom den bara har ett enda uttryck som alltid returneras som standard. Du behรถver inte ens tilldela en lambda heller, eftersom den kan anropas omedelbart (se fรถregรฅende avsnitt). Som du kommer att se blir lambdor sรคrskilt kraftfulla nรคr vi anvรคnder dem med Pythons inbyggda funktioner.

Men du kanske fortfarande undrar hur lambda skiljer sig frรฅn en funktion som returnerar ett enda uttryck (som det ovan). Pรฅ tolknivรฅ รคr det inte sรฅ stor skillnad. Det kanske lรฅter รถverraskande, men vilken lambdafunktion som helst som du definierar i Python behandlas som en normal funktion av tolken.

Pรฅ bytekodnivรฅ hanteras de tvรฅ definitionerna pรฅ samma sรคtt av Python tolk. Nu kan du inte namnge en funktion lambda eftersom det รคr reserverat av Python, men alla andra funktionsnamn kommer att ge samma bytekod.

Vanliga frรฅgor

Ja. En lambda kan anvรคnda ett villkorligt uttryck som lambda x: 'even' if x % 2 == 0 else 'odd'. Den kan inte innehรฅlla en fullstรคndig if-sats, eftersom brรถdtexten i en lambda mรฅste vara ett enda uttryck snarare รคn ett block av satser.

Generellt nej. PEP 8 rekommenderar att man anvรคnder def nรคr en funktion behรถver ett namn, eftersom att binda en lambda till en variabel ger den ett namn men fรถrlorar tydligheten. traceback som def tillhandahรฅller. Lambdas skickas bรคst direkt till funktioner som sorted(), map() eller filter().

Nej. Pรฅ bytekodnivรฅ Python behandlar en lambda och en motsvarande def pรฅ samma sรคtt, sรฅ det finns ingen hastighetsfรถrdel. En lambda sparar bara en rad kod; den kรถrs inte snabbare รคn en namngiven funktion som utfรถr identiskt arbete.

Ja. En lambda kan lรคsa variabler frรฅn det omslutande omfรฅnget och bilda en avslutning. Var fรถrsiktig inuti en loop: lambdan fรฅngar sjรคlva variabeln, inte dess aktuella vรคrde, sรฅ anvรคnd ett standardargument som lambda x, n=n: x + n fรถr att frysa den.

Skicka en lambda som nyckelargument till sorted() eller list.sort(). Till exempel sorterar sorted(users, key=lambda u: u['age']) objekt efter รฅlder. Lambda talar om Python vilket vรคrde som ska jรคmfรถras fรถr varje element, vilket ger en koncis anpassad sortering utan en separat namngiven funktion.

Inte direkt, eftersom en anonym lambda inte har nรฅgot namn att referera till. Du kan kringgรฅ detta genom att tilldela lambdan till en variabel och anropa det namnet, men en vanlig def-funktion รคr det tydligare och rekommenderade valet fรถr rekursion.

Lambdas driver snabba, inline-transformationer i AI- och maskininlรคrningskod. Dataforskare skickar dem till pandas .apply(), map() och filter() fรถr att rensa eller omforma data, och som nyckelfunktioner fรถr sorteringsfunktioner, keeping fรถrbehandlingskompakt inuti stรถrre trรคningspipelines.

GitHub Copilot fรถreslรฅr kompletta lambda-uttryck frรฅn en kort kommentar eller den omgivande koden, inklusive korrekta parametrar och uttryck fรถr map(), filter() eller sorted()-anrop. Den kan ocksรฅ fรถreslรฅ att en utfรถrlig lambda konverteras till en tydligare namngiven funktion nรคr lรคsbarheten รคr viktig.

Sammanfatta detta inlรคgg med: