Како користити Ламбда функције у Питхон-у [With Examples]

Увод у Ламбда функције у Пајтону

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

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

Започнимо!

Синтакса и примери Ламбда функција у Пајтону

Општа структура за дефинисање ламбда функције у Пајтону је следећа:

lambda parametar(i): povratna_vrednost

У горњој синтакси:

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

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

Илустративни примери Ламбда функција у Пајтону

Најбољи начин да се разумеју ламбда функције је да се крене са трансформацијом обичних Пајтон функција у њихове ламбда еквиваленте.

👩🏽‍💻 Можете паралелно пратити примере кодирањем у Пајтон РЕПЛ-у или у неком онлајн Пајтон едитору.

Пример #1: Размотрите функцију square() која узима број (num) као улаз и враћа његов квадрат.

def square(num):
    return num*num

Функцију можете позвати са аргументима и верификовати њен рад.

>>> square(9)
81
>>> square(12)
144

Ламбда израз можемо доделити променљивој, на пример kvadrat1, да бисмо скратили дефиницију функције: kvadrat1 = lambda broj: broj*broj. Затим бисмо могли позвати kvadrat1 са било којим бројем. Ипак, будући да ламбда функције треба да буду анонимне, препоручује се да се избегава додељивање ламбда израза променљивим.

За функцију square(), параметар је num, а повратна вредност је num*num. Након што идентификујемо ове елементе, можемо их уклопити у ламбда израз:

>>> (lambda num: num*num)(2)
4

Овде видимо концепт одмах позване функције, где функцију позивамо одмах по дефинисању.

Пример #2: Сада ћемо претворити једноставну функцију add() која узима два броја, num1 и num2, и враћа њихов збир, num1 + num2.

def add(num1,num2):
    return num1 + num2

Функцију add() позивамо са два броја као аргументима:

>>> add(4,3)
7
>>> add(12,5)
17
>>> add(12,6)
18

У овом случају, num1 и num2 су параметри, а повратна вредност је num1 + num2.

>>> (lambda num1, num2: num1 + num2)(3,7)
10

Пајтон функције такође могу имати подразумеване вредности параметара. Хајде да модификујемо дефиницију функције add() и поставимо подразумевану вредност за параметар num2 на 10.

def add(num1, num2=10):
    return num1 + num2

Приликом следећих позива функције:

  • У првом позиву функције, вредност num1 је 1, а вредност num2 је 3. Када се проследи вредност за num2 приликом позива, та вредност се користи, а функција враћа 4.
  • Међутим, ако се проследи само један аргумент (num1 је 7), подразумевана вредност 10 се користи за num2, те функција враћа 17.
>>> add(1,3)
4
>>> add(7)
17

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

>>> (lambda num1, num2 = 10: num1 + num2)(1)
11

Када користити ламбда функције у Пајтону?

Сада када смо разумели основе ламбда функција у Пајтону, ево неких ситуација када их је прикладно користити:

  • Када имамо функцију која враћа вредност израчунату у једном реду кода и не морамо је референцирати на другим местима у истом модулу, можемо користити ламбда функције. Илустровали смо ово са примерима.
  • Можемо користити ламбда функције када радимо са уграђеним функцијама попут map(), filter() и reduce().
  • Ламбда функције могу бити корисне при сортирању Пајтон структура података попут листи и речника.

Примена Ламбда функција са уграђеним функцијама

1. Ламбда са map()

Функција map() узима итерабле (нпр. листу) и функцију, а затим примењује функцију на сваки елемент у итераблу:

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

>>> nums = [4,5,6,9]
>>> list(map(lambda num:num*num,nums))
[16, 25, 36, 81]

Пошто map() враћа објекат типа мапа, морамо га претворити у листу да бисмо видели резултат.

▶ Погледајте додатне информације о функцији map() у Пајтону.

2. Ламбда са filter()

Дефинишимо листу бројева nums:

>>> nums = [4,5,6,9]

Претпоставимо да желимо да филтрирамо ову листу и задржимо само непарне бројеве.

За то можемо користити уграђену Пајтон функцију filter().

filter() прима услов и итерабле: filter(uslov, iterable). Резултат садржи само оне елементе из оригиналног итерабла који задовољавају услов. Враћени објекат можемо претворити у неку другу Пајтон структуру, на пример, у листу.

Да бисмо филтрирали парне бројеве и задржали само непарне, ламбда израз треба да буде lambda num: num%2 != 0. Израз num%2 даје остатак након дељења броја са 2.

  • num%2 != 0 је тачно кад год је num непаран, и
  • num%2 != 0 је нетачно кад год је num паран.
>>> nums = [4,5,6,9]
>>> list(filter(lambda num:num%2!=0,nums))
[5, 9]

3. Ламбда са reduce()

Функција reduce() прихвата итерабле и функцију. Она смањује итерабле применом функције итеративно на његове елементе.

Да бисте користили reduce(), потребно је да је увезете из уграђеног Пајтон модула functools:

>>> from functools import reduce

Користићемо reduce() да израчунамо збир свих бројева у листи nums. Дефинишемо ламбда израз: lambda num1, num2: num1 + num2, као функцију редукције суме.

Операција редукције ће изгледати овако: f(f(f(4,5),6),9) = f(f(9,6),9) = f(15,9) = 24. Овде је f операција сабирања два елемента листе, дефинисана ламбда функцијом.

>>> from functools import reduce
>>> nums = [4,5,6,9]
>>> reduce(lambda num1,num2:num1+num2,nums)
24

Ламбда функције за прилагођено сортирање у Пајтону

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

1. Сортирање Пајтон листа

При раду са Пајтон листама, често ће бити потребно сортирати их на основу одређених критеријума. Да бисмо сортирали листу на месту, користимо уграђени метод sort(). Ако је потребна сортирана копија листе, можемо користити функцију sorted().

Синтакса функције sorted() је следећа: sorted(iterable, key=..., reverse=True|False).

  • Параметар key се користи за прилагођавање сортирања.
  • Параметар reverse може бити подешен на True или False; подразумевана вредност је False.

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

Посматрајмо листу воћа. Желимо да добијемо сортирану копију листе. Потребно је да сортирамо низове према броју појављивања карактера ‘p’ у њима – у опадајућем редоследу.

>>> fruits = ['apple','pineapple','grapes','mango']

Сада је време да се употреби опциони параметар key. Низ је итерабле у Пајтону, и да бисмо добили број појављивања карактера, користићемо метод .count(). Дакле, key постављамо на lambda x: x.count('p'), тако да се сортирање врши на основу броја појављивања слова ‘p’.

>>> fruits = ['apple','pineapple','grapes','mango']
>>> sorted(fruits,key=lambda x:x.count('p'),reverse=True)
['pineapple', 'apple', 'grapes', 'mango']

У овом примеру:

  • Критеријум сортирања је број појављивања слова ‘p’, који је дефинисан ламбда изразом.
  • Пошто је параметар reverse постављен на True, сортирање се врши у опадајућем редоследу броја појављивања слова ‘p’.

У листи воћа, ‘ананас’ садржи 3 појављивања слова ‘p’, док ‘јабука’, ‘грожђе’ и ‘манго’ садрже 2, 1 и 0 појављивања слова ‘p’, респективно.

Разумевање стабилног сортирања

Посматрајмо још један пример. За исти критеријум сортирања, редефинисали смо листу воћа. Овде се ‘p’ појављује у ‘јабука’ и ‘грожђе’ два и једном, респективно. И не појављује се у ‘манго’ и ‘динjа’.

>>> fruits = ['mango','apple','melon','grapes']
>>> sorted(fruits,key=lambda x:x.count('p'),reverse=True)
['apple', 'grapes', 'mango', 'melon']

У излазној листи, ‘манго’ се појављује пре ‘динjе’ иако оба немају карактер ‘p’. Зашто је то тако? Функција sorted() врши стабилно сортирање; када је број слова ‘p’ једнак за два низа, редослед елемената у оригиналној листи се чува.

За кратку вежбу, замените позиције ‘манго’ и ‘динjе’ у листи воћа, сортирајте листу са истим критеријумом и погледајте резултат.

▶ Сазнајте више о сортирању Пајтон листа.

2. Сортирање Пајтон речника

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

>>> price_dict = {
... 'Milk':10,
... 'Honey':15,
... 'Bread':7,
... 'Candy':3
... }

Да бисмо добили парове кључ/вредност речника као листу торки, можемо користити метод .items():

>>> price_dict_items = price_dict.items()
dict_items([('Milk', 10), ('Honey', 15), ('Bread', 7), ('Candy', 3)])

У Пајтону, сви итерабли: листе, торке, низови итд., имају нулти индекс. Први елемент је на индексу 0, други на 1, и тако даље.

Желимо да сортирамо по вредности, односно цени сваког производа у речнику. У свакој торки из price_dict_items, цена се налази на индексу 1. Дакле, постављамо key на lambda x: x[1], јер ће се за сортирање користити елемент са индексом 1 (цена).

>>> dict(sorted(price_dict_items,key=lambda x:x[1]))
{'Candy': 3, 'Bread': 7, 'Milk': 10, 'Honey': 15}

У излазном речнику, ставке су сортиране у растућем редоследу по цени: од ‘Candy’ (3 јединице) до ‘Honey’ (15 јединица).

▶ Погледајте детаљан водич о сортирању Пајтон речника по кључу и вредности.

Закључак

Успели сте! Сада разумете како се дефинишу ламбда функције и како се ефикасно користе са другим уграђеним функцијама у Пајтону. Резимирајмо кључне тачке:

  • Ламбда функције у Пајтону су анонимне функције које могу примити више аргумената и вратити вредност. Израз који се израчунава да би се генерисала повратна вредност мора бити у једном реду кода. Користе се за сажетије дефинисање малих функција.
  • Ламбда функцију дефинишемо користећи следећу синтаксу: lambda параметри: повратна_вредност.
  • Важне примене укључују употребу са функцијама map(), filter() и reduce() и као параметар key за прилагођавање сортирања Пајтон итерабла.

Даље, научите како да извршите дељење у Пајтону.