Питхон Ламбда функције са ПРИМЕРИМА

Преглед садржаја:

Anonim

Шта је Ламбда функција у Питхону?

Ламбда функције у Питхон програмирање је анонимна функција или функција која нема име. То је мала и ограничена функција која нема више од једне линије. Баш као и нормална функција, Ламбда функција може имати више аргумената са једним изразом.

У Питхону се ламбда изрази (или ламбда облици) користе за конструкцију анонимних функција. Да бисте то урадили, користићете ламбда кључну реч (баш као што користите деф за дефинисање нормалних функција). Свака анонимна функција коју дефинишете у Питхону имаће 3 основна дела:

  • Кључна реч ламбда.
  • Параметри (или везане променљиве) и
  • Тело функције.

Ламбда функција може имати било који број параметара, али тело функције може садржати само један израз. Штавише, ламбда је написана у једном реду кода и такође се може одмах позвати. Све ово на делу ћете видети у наредним примерима.

У овом упутству за Ламбда ин Питхон научићете:

  • Синтакса и примери
  • Коришћење ламбда-кола са уграђеним Питхон-ом
  • ламбда у филтеру ()
  • ламбда на мапи ()
  • ламбда у редукцији ()
  • Зашто (и зашто не) користити ламбда функције?
  • Ламбдас вс. Регуларне функције

Синтакса и примери

Формална синтакса за писање ламбда функције је дата у наставку:

lambda p1, p2: expression 

Овде су п1 и п2 параметри који се прослеђују ламбда функцији. Можете додати онолико параметара колико вам је потребно.

Међутим, имајте на уму да око параметара не користимо заграде као што је то случај са уобичајеним функцијама. Последњи део (израз) је било који важећи питхон израз који делује на параметре које пружате функцији.

Пример 1

Сад кад знате за ламбде, пробајмо са примером. Дакле, отворите свој ИДЛЕ и откуцајте следеће:

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

Ево резултата:

3

Објашњење кода

Овде дефинишемо променљиву која ће садржати резултат враћен ламбда функцијом.

1. Кључна реч ламбда која се користи за дефинисање анонимне функције.

2. к и и су параметри које преносимо на ламбда функцију.

3. Ово је тело функције, које додаје 2 параметра која смо проследили. Приметите да је то један израз. Не можете написати више изјава у тело ламбда функције.

4. Позивамо функцију и исписујемо враћену вредност.

Пример 2

То је био основни пример за разумевање основа и синтаксе ламбда. Покушајмо сада да одштампамо ламбда и видимо резултат. Поново отворите свој ИДЛЕ и унесите следеће:

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

Сада сачувајте датотеку и притисните Ф5 да бисте покренули програм. Ово је излаз који бисте требали добити.

Излаз:

 at 0x00000185C3BF81E0>

Шта се овде дешава? Погледајмо код да бисмо га даље разумели.

Објашњење кода

  1. Овде дефинишемо низ који ћете проследити као параметар ламбда.
  2. Декларишемо ламбда која позива испис за испис и исписује резултат.

Али зашто програм не штампа низ који пролазимо? То је зато што сама ламбда враћа функцијски објекат. У овом примеру функција ламбде не позива функцију штампања, већ једноставно враћа функцијски објекат и меморијску локацију на којој је ускладиштена. То се штампа на конзоли.

Пример 3

Међутим, ако напишете овакав програм:

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

И покрените га притиском на Ф5, видећете овакав излаз.

Излаз:

some kind of a useless lambda

Сада се позива ламбда и низ који прођемо исписује се на конзоли. Али каква је та чудна синтакса и зашто је ламбда дефиниција обухваћена заградама? Схватимо то сада.

Објашњење кода

  1. Ево истог низа који смо дефинисали у претходном примеру.
  2. У овом делу дефинишемо ламбда и позивамо је одмах предавањем низа као аргумента. Ово се назива ИИФЕ, а о њему ћете сазнати више у наредним одељцима овог водича.

Пример 4

Погледајмо последњи пример да бисмо разумели како се извршавају ламбда и регуларне функције. Дакле, отворите свој ИДЛЕ и у нову датотеку откуцајте следеће:

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

Сада сачувајте датотеку и притисните Ф5 да бисте покренули програм. Ако нисте погрешили, излаз би требао бити отприлике овакав.

Излаз:

штампач 1 РЕДОВНИ ПОЗИВ

штампач 2 РЕДОВНИ ПОЗИВ

штампач 1 ЛАМБДА ПОЗИВ

штампач 2 ЛАМБДА ПОЗИВ

Објашњење кода

  1. Функција која се назива гуру која узима другу функцију као први параметар и све друге аргументе који је прате.
  2. принтер_оне је једноставна функција која исписује прослеђени параметар и враћа га.
  3. принтер_тво је сличан принтер_оне, али без повратне изјаве.
  4. У овом делу позивамо функцију гуру и као параметре прослеђујемо функције штампача и низ.
  5. Ово је синтакса за постизање четвртог корака (тј. Позивање функције гуруа), али коришћењем ламбда.

У следећем одељку ћете научити како да користите ламбда функције са мапом (), смањењем () и филтрирањем () у Питхону.

Коришћење ламбда-кола са уграђеним Питхон-ом

Ламбда функције пружају елегантан и моћан начин извођења операција користећи уграђене методе у Питхону. Могуће је јер се ламбде могу одмах позвати и проследити као аргумент овим функцијама.

ИИФЕ у Питхон Ламбда

ИИФЕ је скраћеница за извршење функције које се одмах позива. То значи да се ламбда функција може позвати чим је дефинише. Да разумемо ово на примеру; упалите свој ИДЛЕ и укуцајте следеће:

 (lambda x: x + x)(2) 

Ево објашњења резултата и кода:

Ова способност ламбда-а које се позивају одмах омогућава вам да их користите унутар функција попут мап () и смањења (). Корисно је јер можда нећете желети да поново користите ове функције.

ламбда у филтеру ()

Функција филтера користи се за одабир одређених елемената из низа елемената. Низ може бити било који итератор попут листа, скупова, корпица итд.

Елементи који ће бити изабрани заснивају се на неким унапред дефинисаним ограничењима. Потребна су 2 параметра:

  • Функција која дефинише ограничење филтрирања
  • Низ (било који итератор као што су листе, корице итд.)

На пример,

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

Ево резултата:

[10, 8, 7, 5, 11]

Објашњење кода:

1. У првом исказу дефинишемо листу названу секвенце која садржи неке бројеве.

2. Овде декларишемо променљиву названу филтеред_ресулт, која ће чувати филтриране вредности које враћа функција филтер ().

3. Ламбда функција која се покреће на сваком елементу листе и враћа вредност труе ако је већа од 4.

4. Одштампајте резултат који је вратила функција филтера.

ламбда на мапи ()

функција мапе користи се за примену одређене операције на сваки елемент у низу. Као и филтер (), такође су потребна два параметра:

  1. Функција која дефинише опцију за извођење на елементима
  2. Једна или више секвенци

На пример, овде је програм који штампа квадрате бројева на датој листи:

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

Излаз:

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

[КР1]

Објашњење кода:

  1. Овде дефинишемо листу која се назива секвенце која садржи неке бројеве.
  2. Декларишемо променљиву названу филтеред_ресулт која ће чувати мапиране вредности
  3. Ламбда функција која се покреће на сваком елементу листе и враћа квадрат тог броја.
  4. Одштампајте резултат који је вратила функција мапе.

ламбда у редукцији ()

Функција редукције, попут мап (), користи се за примену операције на сваки елемент у низу. Међутим, по начину рада се разликује од карте. Ово су кораци које следи функција редуце () за израчунавање резултата:

Корак 1) Извршите дефинисану операцију на прва 2 елемента низа.

Корак 2) Сачувајте овај резултат

Корак 3) Извршите операцију са сачуваним резултатом и следећим елементом у низу.

Корак 4) Понављајте док не остане више елемената.

Потребна су и два параметра:

  1. Функција која дефинише операцију коју треба извршити
  2. Низ (било који итератор као што су листе, корице итд.)

На пример, овде је програм који враћа производ свих елемената на листи:

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

Ево резултата:

120

Објашњење кода:

  1. Увези редукцију из модула фунцтоолс
  2. Овде дефинишемо листу која се назива секвенце која садржи неке бројеве.
  3. Декларишемо променљиву која се назива производ која ће чувати смањену вредност
  4. Ламбда функција која се покреће на сваком елементу листе. Вратиће производ тог броја према претходном резултату.
  5. Одштампајте резултат који је вратила функција смањења.

Зашто (и зашто не) користити ламбда функције?

Као што ћете видети у следећем одељку, ламбда се третира исто као и редовне функције на нивоу тумача. На неки начин, могло би се рећи да ламбда дају компактну синтаксу за писање функција које враћају један израз.

Међутим, требали бисте знати када је добра идеја користити ламбде и када их избегавати. У овом одељку ћете научити неке од принципа дизајна које су програмери питхона користили приликом писања ламбда-кола.

Један од најчешћих случајева употребе ламбдас је у функционалном програмирању, јер Питхон подржава парадигму (или стил) програмирања познат као функционално програмирање.

Омогућава вам да пружите функцију као параметар другој функцији (на пример, у мапи, филтру итд.). У таквим случајевима употреба ламбда нуди елегантан начин за стварање једнократне функције и прослеђивање као параметар.

Када не би требало да користите Ламбду?

Никада не бисте требали писати компликоване ламбда функције у производном окружењу. Кодери који одржавају ваш код биће веома тешко да га дешифрују. Ако се заложите за израду сложених једнолинијских израза, била би много супериорнија пракса да дефинишете одговарајућу функцију. Као најбољу праксу, морате имати на уму да је једноставни код увек бољи од сложеног.

Ламбдас вс. Регуларне функције

Као што је претходно речено, ламбда су [вВ4] [Ј5] само функције које немају идентификатор везан за њих. Једноставније речено, то су функције без имена (дакле, анонимне). Ево табеле која илуструје разлику између ламбда и регуларних функција у питхону.

Ламбда

Редовне функције

Синтакса:

lambda x : x + x 

Синтакса:

def (x) :return x + x

Ламбда функције могу имати само један израз у свом телу.

Регуларне функције могу у свом телу имати више израза и израза.

Ламбде са њима нису повезане. Због тога су познате и као анонимне функције.

Редовне функције морају имати име и потпис.

Ламбде не садрже изјаву о повратку, јер се тело аутоматски враћа.

Функције којима треба да врате вредност треба да укључују израз за повратак.

Објашњење разлика?

Примарна разлика између ламбда и регуларне функције је у томе што ламбда функција процењује само један израз и даје функцијски објекат. Сходно томе, можемо именовати резултат ламбда функције и користити га у нашем програму као што смо то урадили у претходном примеру.

Регуларна функција за горњи пример изгледала би овако:

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

Овде морамо дефинисати име функције која враћа резултат када је позовемо . Ламбда функција не садржи наредбу ретурн, јер ће имати само један израз који се увек враћа по дефаулту. Не морате чак ни да доделите ламбду, јер се на њу може одмах позвати (погледајте следећи одељак). Као што ћете видети у следећем примеру, ламбде постају посебно моћне када их користимо са уграђеним функцијама Питхона.

Међутим, можда се и даље питате како се ламбда разликује од функције која враћа један израз (попут горњег). На нивоу тумача нема велике разлике. Можда звучи изненађујуће, али тумач сваку ламбда функцију коју дефинишете у Питхону третира као нормалну функцију.

Као што можете видети на дијаграму, две дефиниције обрађују питхон интерпретер на исти начин када се конвертују у битецоде. Сада не можете именовати функцију ламбда, јер је Питхон то резервисао, али било које друго име функције ће дати исти бајт код [КР6].

Резиме

  • Ламбде, такође познате као анонимне функције, мале су, ограничене функције којима није потребно име (тј. Идентификатор).
  • Свака ламбда функција у Питхону има 3 основна дела:
  • Кључна реч ламбда.
  • Параметри (или везане променљиве) и
  • Тело функције.
  • Синтакса за писање ламбда је: ламбда параметар: израз
  • Ламбде могу имати било који број параметара, али нису затворене у заграде
  • Ламбда може у свом телу функције имати само 1 израз, који се подразумевано враћа.
  • На нивоу бајткода, нема велике разлике између начина на који тумач обрађује ламбде и редовне функције.
  • Ламбде подржавају ИИФЕ кроз ову синтаксу: (ламбда параметар: израз) (аргумент)
  • Ламбде се обично користе са следећим уграђеним питонима:
  • Филтер: филтер (ламбда параметар: израз, итерабилна секвенца)
  • Мапа: мапа (ламбда параметар: израз, итерабилне секвенце)
  • Смањи: смањи (ламбда параметар1, параметар2: израз, итерабилна секвенца)
  • Не пишите компликоване ламбда функције у производном окружењу, јер ће одржавачима кода бити тешко.

[Ј5] Додао сам табелу, али објашњење је неопходно да би се разумеле разлике.