Čo je funkcia lambda v Pythone?
Lambda funkcie Python programovanie je anonymný funkcia, alebo funkcie, ktoré nemajú meno. Je to malá a obmedzená funkcia, ktorá nemá viac ako jeden riadok. Rovnako ako normálna funkcia, aj funkcia Lambda môže mať viac argumentov s jedným výrazom.
V Pythone sa na zostavenie anonymných funkcií používajú výrazy lambda (alebo formy lambda). K tomu budete používať lambda kľúčové slovo (rovnako ako použitie def definovať normálne funkcie). Každá anonymná funkcia, ktorú definujete v Pythone, bude mať 3 základné časti:
- Kľúčové slovo lambda.
- Parametre (alebo viazané premenné) a
- Funkčný orgán.
Funkcia lambda môže mať ľubovoľný počet parametrov, ale telo funkcie môže obsahovať iba jeden výraz. Lambda je navyše napísaná v jednom riadku kódu a dá sa tiež okamžite vyvolať. Toto všetko uvidíte v akcii v nasledujúcich príkladoch.
V tomto výučbe Lambda v Pythone sa dozviete:
- Syntax a príklady
- Používanie lambdas so zabudovanými modulmi Python
- lambdy vo filtri ()
- lambdas v mape ()
- lambdy v redu ()
- Prečo (a prečo nie) používať funkcie lambda?
- Lambdas vs. pravidelné funkcie
Syntax a príklady
Formálna syntax na zápis funkcie lambda je uvedená nižšie:
lambda p1, p2: expression
Tu sú parametre p1 a p2 odovzdávané funkcii lambda. Môžete pridať toľko alebo málo parametrov, koľko potrebujete.
Všimnite si však, že nepoužívame zátvorky okolo parametrov ako pri bežných funkciách. Posledná časť (výraz) je akýkoľvek platný výraz v jazyku python, ktorý pracuje s parametrami, ktoré zadáte funkcii.
Príklad 1
Teraz, keď viete o lambdách, skúsme to na príklade. Takže otvorte IDLE a zadajte nasledovné:
adder = lambda x, y: x + yprint (adder (1, 2))
Tu je výstup:
3
Vysvetlenie kódu
Tu definujeme premennú, ktorá bude obsahovať výsledok vrátený funkciou lambda.
1. Kľúčové slovo lambda používané na definovanie anonymnej funkcie.
2. xay sú parametre, ktoré odovzdáme funkcii lambda.
3. Toto je telo funkcie, ktoré pridáva 2 parametre, ktoré sme prešli. Všimnite si, že ide o jediný výraz. Do tela funkcie lambda nemôžete písať viac príkazov.
4. Zavoláme funkciu a vrátenú hodnotu vytlačíme.
Príklad 2
To bol základný príklad na pochopenie základov a syntaxe lambda. Pokúsme sa teraz vytlačiť lambdu a uvidíme výsledok. Opäť otvorte IDLE a zadajte nasledovné:
#What a lambda returnsstring='some kind of a useless lambda'print(lambda string : print(string))
Teraz uložte súbor a stlačením klávesu F5 spustite program. Toto je výstup, ktorý by ste mali dostať.
Výkon:
at 0x00000185C3BF81E0>
Čo sa to tu deje? Pozrime sa na kód, aby sme mu porozumeli ďalej.
Vysvetlenie kódu
- Tu definujeme reťazec, ktorý odovzdáte ako parameter lambda.
- Deklarujeme lambdu, ktorá volá tlačový výpis a vytlačí výsledok.
Prečo ale program nevytlačí reťazec, ktorý minieme? Je to preto, že samotná lambda vráti funkčný objekt. V tomto príklade lambda nie je volaná funkciou tlače, ale iba vrátením funkčného objektu a umiestnenia pamäte, kde je uložená. To je to, čo sa vytlačí na konzole.
Príklad 3
Ak však napíšete tento program:
#What a lambda returns #2x="some kind of a useless lambda"(lambda x : print(x))(x)
Spustite ho stlačením klávesu F5, uvidíte výstup ako tento.
Výkon:
some kind of a useless lambda
Teraz sa volá lambda a reťazec, ktorý minieme, sa vytlačí na konzole. Čo je to však za podivnú syntax a prečo je definícia lambda uvedená v zátvorkách? Poďme to teraz pochopiť.
Vysvetlenie kódu
- Tu je rovnaký reťazec, aký sme definovali v predchádzajúcom príklade.
- V tejto časti definujeme lambdu a okamžite ju voláme odovzdaním reťazca ako argumentu. Toto sa nazýva IIFE a viac sa o ňom dozviete v nasledujúcich častiach tohto tutoriálu.
Príklad 4
Pozrime sa na posledný príklad, aby sme pochopili, ako sa vykonávajú lambdy a bežné funkcie. Takže otvorte IDLE a do nového súboru zadajte nasledujúce:
#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'))
Teraz súbor uložte a stlačením klávesu F5 spustite program. Ak ste neurobili žiadnu chybu, výstup by mal byť asi taký.
Výkon:
tlačiareň 1 PRAVIDELNÉ HOVOR
tlačiareň 2 PRAVIDELNÉ HOVOR
tlačiareň 1 LAMBDA HOVOR
tlačiareň 2 LAMBDA HOVOR
Vysvetlenie kódu
- Funkcia nazývaná guru, ktorá vezme inú funkciu ako prvý parameter a akékoľvek ďalšie argumenty, ktoré nasledujú.
- printer_one je jednoduchá funkcia, ktorá vytlačí odovzdaný parameter a vráti ho.
- printer_two je podobný printer_one, ale bez príkazu na vrátenie.
- V tejto časti voláme funkciu guru a ako parametre odovzdávame funkcie tlačiarne a reťazec.
- Toto je syntax na dosiahnutie štvrtého kroku (tj. Volanie funkcie guru), ale pomocou lambdas.
V nasledujúcej časti sa dozviete, ako používať funkcie lambda s map (), redukovať () a filtrovať () v Pythone.
Používanie lambdas so zabudovanými modulmi Python
Funkcie Lambda poskytujú elegantný a výkonný spôsob vykonávania operácií pomocou zabudovaných metód v Pythone. Je to možné, pretože lambda je možné vyvolať okamžite a odovzdať ako argument týmto funkciám.
IIFE v jazyku Python Lambda
IIFE znamená okamžité vyvolanie vykonania funkcie. To znamená, že funkciu lambda je možné vyvolať hneď, ako je definovaná. Poďme to pochopiť na príklade; zapnite IDLE a zadajte nasledovné:
(lambda x: x + x)(2)
Tu je vysvetlenie výstupu a kódu:
Táto schopnosť okamžitého vyvolania lambd vám umožňuje používať ich vo vnútri funkcií ako map () a redukovať (). Je to užitočné, pretože možno nebudete chcieť tieto funkcie znova používať.
lambdy vo filtri ()
Funkcia filtra sa používa na výber niektorých konkrétnych prvkov z postupnosti prvkov. Sekvenciou môže byť akýkoľvek iterátor, napríklad zoznamy, množiny, n-tice atď.
Vybraté prvky sú založené na niektorých vopred definovaných obmedzeniach. Trvá to 2 parametre:
- Funkcia, ktorá definuje obmedzenie filtrovania
- Sekvencia (akýkoľvek iterátor, ako sú zoznamy, n-tice atď.)
Napríklad,
sequences = [10,2,8,7,5,4,3,11,0, 1]filtered_result = filter (lambda x: x > 4, sequences)print(list(filtered_result))
Tu je výstup:
[10, 8, 7, 5, 11]
Vysvetlenie kódu:
1. V prvom výroku definujeme zoznam nazývaný sekvencie, ktorý obsahuje niekoľko čísel.
2. Tu deklarujeme premennú nazvanú filtrovaný_výsledok, ktorá uloží filtrované hodnoty vrátené funkciou filter ().
3. Funkcia lambda, ktorá beží na každom prvku zoznamu a vráti hodnotu true, ak je väčšia ako 4.
4. Vytlačte výsledok vrátený funkciou filtra.
lambdas v mape ()
funkcia mapy sa používa na použitie konkrétnej operácie na každý prvok v poradí. Rovnako ako filter (), tiež vyžaduje 2 parametre:
- Funkcia, ktorá definuje operáciu, ktorá má vykonávať na prvkoch
- Jedna alebo viac sekvencií
Napríklad tu je program, ktorý vytlačí druhé mocniny čísel v danom zozname:
sequences = [10,2,8,7,5,4,3,11,0, 1]filtered_result = map (lambda x: x*x, sequences)print(list(filtered_result))
Výkon:
[100, 4, 64, 49, 25, 16, 121, 0, 1]
[KR1]
Vysvetlenie kódu:
- Tu definujeme zoznam nazývaný sekvencie, ktorý obsahuje niekoľko čísel.
- Deklarujeme premennú nazvanú filtrovaný_výsledok, ktorá uloží mapované hodnoty
- Funkcia lambda, ktorá beží na každom prvku zoznamu a vracia štvorec tohto čísla.
- Vytlačte výsledok vrátený funkciou mapy.
lambdy v redu ()
Funkcia redukovať, ako map (), sa používa na aplikovanie operácie na každý prvok v poradí. Od mapy sa však líši svojím fungovaním. Toto sú kroky, ktoré nasleduje po funkcii redukovať () na výpočet výstupu:
Krok 1) Vykonajte definovanú operáciu na prvých 2 prvkoch sekvencie.
Krok 2) Uložte tento výsledok
Krok 3) Vykonajte operáciu s uloženým výsledkom a ďalším prvkom v poradí.
Krok 4) Opakujte, až kým nezostanú ďalšie prvky.
Trvá tiež dva parametre:
- Funkcia, ktorá definuje operáciu, ktorá sa má vykonať
- Sekvencia (akýkoľvek iterátor, ako sú zoznamy, n-tice atď.)
Napríklad tu je program, ktorý vracia súčin všetkých prvkov v zozname:
from functools import reducesequences = [1,2,3,4,5]product = reduce (lambda x, y: x*y, sequences)print(product)
Tu je výstup:
120
Vysvetlenie kódu:
- Importovať zníženie z modulu functools
- Tu definujeme zoznam nazývaný sekvencie, ktorý obsahuje niekoľko čísel.
- Deklarujeme premennú nazvanú produkt, ktorá uloží zníženú hodnotu
- Funkcia lambda, ktorá sa spúšťa na každom prvku zoznamu. Vráti súčin tohto čísla podľa predchádzajúceho výsledku.
- Vytlačí výsledok vrátený funkciou zmenšenia.
Prečo (a prečo nie) používať funkcie lambda?
Ako uvidíte v nasledujúcej časti, s lambdami sa na úrovni tlmočníka zaobchádza rovnako ako s bežnými funkciami. Dalo by sa povedať, že lambda poskytuje kompaktnú syntax pre funkcie písania, ktoré vracajú jediný výraz.
Mali by ste však vedieť, kedy je dobré lambdy používať a kedy sa im vyhnúť. V tejto časti sa dozviete niektoré princípy návrhu, ktoré používajú vývojári pythonu pri písaní lambdas.
Jedným z najbežnejších prípadov použitia lambdas je funkčné programovanie, pretože Python podporuje paradigmu (alebo štýl) programovania známu ako funkčné programovanie.
Umožňuje vám poskytnúť funkciu ako parameter inej funkcii (napríklad v mape, filtri atď.). V takýchto prípadoch ponúka použitie lambdas elegantný spôsob, ako vytvoriť jednorazovú funkciu a odovzdať ju ako parameter.
Kedy by ste nemali použiť Lambdu?
V produkčnom prostredí by ste nikdy nemali písať komplikované funkcie lambda. Pre kóderov, ktorí udržiavajú váš kód, bude jeho dešifrovanie veľmi ťažké. Ak zistíte, že robíte zložité jednoriadkové výrazy, bolo by oveľa lepšou praxou definovať správnu funkciu. Ako najlepší postup si musíte uvedomiť, že jednoduchý kód je vždy lepší ako zložitý kód.
Lambdas vs. pravidelné funkcie
Ako už bolo uvedené, lambdy sú [vV4] [J5] iba funkciami, ktoré na ne nemajú viazaný identifikátor. Jednoduchšie povedané, sú to funkcie bez mien (teda anonymné). Tu je tabuľka na ilustráciu rozdielu medzi lambdami a bežnými funkciami v pythone.
Lambdas
Pravidelné funkcie
Syntax:
lambda x : x + x
Syntax:
def (x) :return x + x
Funkcie lambda môžu mať v tele iba jeden výraz.
Regulárne funkcie môžu mať v tele viacero výrazov a výrokov.
Lambdy nemajú s nimi spojené meno. Preto sú známe aj ako anonymné funkcie.
Pravidelné funkcie musia mať meno a podpis.
Lambdy neobsahujú príkaz na vrátenie, pretože telo sa vráti automaticky.
Funkcie, ktoré musia vrátiť hodnotu, by mali obsahovať príkaz na vrátenie.
Vysvetlenie rozdielov?
Primárny rozdiel medzi lambda a bežnou funkciou je v tom, že funkcia lambda vyhodnocuje iba jeden výraz a poskytuje objekt funkcie. Následne môžeme pomenovať výsledok funkcie lambda a použiť ho v našom programe tak, ako sme to urobili v predchádzajúcom príklade.
Pravidelná funkcia pre vyššie uvedený príklad by vyzerala takto:
def adder (x, y):return x + yprint (adder (1, 2))
Tu musíme definovať názov funkcie, ktorá vráti výsledok, keď ho zavoláme . Funkcia lambda neobsahuje návratový príkaz, pretože bude mať iba jeden výraz, ktorý sa predvolene vždy vráti. Ani nemusíte priradiť lambdu, pretože ju možno okamžite vyvolať (pozri nasledujúcu časť). Ako uvidíte v nasledujúcom príklade, lambdy sa stávajú obzvlášť výkonnými, keď ich používame so vstavanými funkciami Pythonu.
Možno vás však stále zaujíma, ako sa lambdy líšia od funkcie, ktorá vracia jediný výraz (ako je ten vyššie). Na úrovni tlmočníkov nie je veľký rozdiel. Môže to znieť prekvapivo, ale s každou funkciou lambda, ktorú definujete v Pythone, interpret zaobchádza ako s normálnou funkciou.
Ako môžete vidieť na diagrame, tieto dve definície spracováva interpret Python po prevedení na bytecode rovnakým spôsobom. Teraz nemôžete pomenovať funkciu lambda, pretože je rezervovaná programom Python, ale akýkoľvek iný názov funkcie prinesie rovnaký bajtkód [KR6].
Zhrnutie
- Lambdy, tiež známe ako anonymné funkcie, sú malé obmedzené funkcie, ktoré nevyžadujú meno (tj. Identifikátor).
- Každá funkcia lambda v Pythone má 3 základné časti:
- Kľúčové slovo lambda.
- Parametre (alebo viazané premenné) a
- Funkčný orgán.
- Syntax pre zápis lambda je: parameter lambda: výraz
- Lambdy môžu mať ľubovoľný počet parametrov, ale nie sú uzavreté v zložených zátvorkách
- Lambda môže mať v tele funkcie iba jeden výraz, ktorý sa predvolene vracia.
- Na úrovni bytecode nie je veľký rozdiel medzi tým, ako tlmočník zaobchádza s lambdami a bežnými funkciami.
- Lambdas podporuje IIFE prostredníctvom tejto syntaxe: (parameter lambda: expression) (argument)
- Lambdy sa bežne používajú s nasledujúcimi vstavanými vlastnosťami pythonu:
- Filter: filter (parameter lambda: expression, iterable-sequence)
- Mapa: mapa (parameter lambda: výraz, opakovateľné sekvencie)
- Zmenšiť: zmenšiť (lambda parameter1, parameter2: výraz, opakovateľná sekvencia)
- Nepíšte komplikované funkcie lambda v produkčnom prostredí, pretože pre správcov kódu to bude ťažké.
[J5] Pridal som tabuľku, ale vysvetlenie je potrebné na pochopenie rozdielov.