Как да използвате ламбда функции в Python [With Examples]

В този урок ще научите всичко за ламбда функциите в Python – от синтаксиса за дефиниране на ламбда функциите до различните случаи на употреба с примерни кодове.

В Python lambdas са анонимни функции, които имат кратък синтаксис и могат да се използват с други полезни вградени функции. До края на този урок ще научите как да дефинирате ламбда функции и кога трябва да обмислите използването им вместо обикновени функции на Python.

Нека да започнем!

Ламбда функция на Python: Синтаксис и примери

Ето общия синтаксис за дефиниране на ламбда функция в Python:

lambda parameter(s):return value

В горния общ синтаксис:

  • ламбда е ключовата дума, която трябва да използвате, за да дефинирате ламбда функция, последвана от един или повече параметри, които функцията трябва да приеме.
  • Има двоеточие, разделящо параметрите и върнатата стойност.

💡 Когато дефинирате ламбда функция, трябва да се уверите, че върнатата стойност е изчислена чрез оценяване на израз, който обхваща един ред код. Ще разберете това по-добре, когато кодираме примери.

Примери за ламбда функция на Python

Най-добрият начин да разберете ламбда функциите е да започнете, като пренапишете обикновените функции на Python като ламбда функции.

👩🏽‍💻 Можете да кодирате заедно в Python REPL или в онлайн редактора на Python на pctechbg.net.

#1. Помислете за следната функция square(), която приема число, num, като аргумент и връща квадрата на числото.

def square(num):
    return num*num

Можете да извикате функцията с аргументи и да проверите дали работи правилно.

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

Можете да присвоите този ламбда израз на име на променлива, да речем square1, за да направите дефиницията на функцията по-кратка: square1 = lambda num: num*num и след това да извикате функция square1 с произволно число като аргумент. Знаем обаче, че ламбда са анонимни функции, така че трябва да избягвате да ги присвоявате на променлива.

За функцията 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

Функциите на Python също могат да приемат стойности по подразбиране за параметри. Нека променим дефиницията на функцията 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

Кога трябва да използвате ламбда функции в Python?

Сега, след като научихте основите на ламбда функциите в Python, ето няколко случая на употреба:

  • Когато имате функция, чийто израз за връщане е един ред код и не е необходимо да препращате към функцията другаде в същия модул, можете да използвате ламбда функции. Също така сме кодирали няколко примера, за да разберем това.
  • Можете да използвате ламбда функции, когато използвате вградени функции, като map(), filter() и reduce().
  • Ламбда функциите могат да бъдат полезни при сортиране на структури от данни на Python като списъци и речници.
  Как да премахнете цялото форматиране от текста на клипборда с клавишна комбинация

Как да използвате Python Lambda с вградени функции

1. Използване на Lambda с map()

Функцията map() приема итерируем и функция и прилага функцията към всеки елемент в итерируемия, както е показано:

Нека създадем списък nums и използваме функцията map(), за да създадем нов списък, който съдържа квадрата на всяко число в списъка nums. Забележете използването на ламбда функция за дефиниране на операцията за повдигане на квадрат.

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

Тъй като функцията map() връща обект на карта, трябва да го преведем в списък.

▶️ Вижте този урок за функцията map() в Python.

2. Използване на Lambda с filter()

Нека дефинираме nums, списък с числа:

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

Да предположим, че искате да филтрирате този списък и да запазите само нечетните числа.

Можете да използвате вградената функция filter() на Python.

Функцията filter() приема условие и итерируемо: filter(condition, iterable). Резултатът съдържа само елементите в оригиналния итерируем, които отговарят на условието. Можете да прехвърлите върнатия обект в итерируем на Python, като списък.

  Как да поправите Adobe Photoshop CC, ако се срива или е бавен

За да филтрираме всички четни числа, ще запазим само нечетните числа. Така че ламбда изразът трябва да бъде ламбда num: num%2!=0. Количеството num%2 е остатъкът, когато num се раздели на 2.

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

3. Използване на Lambda с reduce()

Функцията reduce() приема итерируем и функция. Той намалява итерируемия, като прилага функцията итеративно върху елементите на итерируемия.

За да използвате функцията reduce(), ще трябва да я импортирате от вградения модул functools на Python:

>>> 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

Python Lambda функции за персонализиране на сортирането

В допълнение към използването на ламбда функции с вградени функции на Python, като map(), filter() и reduce(), можете също да ги използвате, за да персонализирате вградените функции и методи, използвани за сортиране.

1. Сортиране на списъци на Python

Когато работите със списъци на Python, често ще трябва да ги сортирате въз основа на определени критерии за сортиране. За да сортирате списъците на Python на място, можете да използвате вградения метод sort() за тях. Ако имате нужда от сортирано копие на списъка, можете да използвате функцията sorted().

Синтаксисът за използване на функцията sorted() на Python е sorted(iterable, key=…,reverse= True | False).

– Ключовият параметър се използва за персонализиране на сортирането.
– Обратният параметър може да бъде зададен на True или False; стойността по подразбиране е False.

Когато сортирате списъци с числа и низове, сортирането по подразбиране е съответно във възходящ и азбучен ред. Въпреки това, понякога може да искате да дефинирате персонализиран критерий за сортиране.

Помислете за следния списък с плодове. Да предположим, че искате да получите сортирано копие на списъка. Трябва да сортирате низовете според броя на срещанията на ‘p’ в тях – в низходящ ред.

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

Време е да използвате незадължителния ключов параметър. Низът е итерируем в Python и за да получите броя на срещанията на символ в него, можете да използвате вградения метод .count(). Така че задаваме ключа на ламбда 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“ и той се дефинира като ламбда израз.
  • Тъй като сме задали обратния параметър на True, сортирането се извършва в низходящ ред на броя на срещанията на „p“.
  10 неща, за които да се погрижите, докато актуализирате BIOS

В списъка с плодове „ананас“ съдържа 3 срещания на „р“, а низовете „ябълка“, „грозде“ и „манго“ съдържат съответно 2, 1 и 0 срещания на „р“.

Разбиране на стабилното сортиране

Помислете за друг пример. За същия критерий за сортиране ние предефинирахме списъка с плодове. Тук ‘p’ се среща в низовете ‘apple’ и ‘grapes’ съответно два и веднъж. И никога не се среща в низовете „манго“ и „пъпеш“.

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

В изходния списък „манго“ идва преди „пъпеш“, въпреки че и двете нямат знака „р“. Но защо е така? Функцията sorted() извършва стабилно сортиране; така че когато броят на ‘p’ е равен за два низа, редът на елементите в оригиналния списък с плодове се запазва.

Като бързо упражнение разменете позициите на „манго“ и „пъпеш“ в списъка с плодове, сортирайте списъка въз основа на същия критерий и наблюдавайте резултата.

▶️ Научете повече за сортирането на списъци на Python.

2. Сортиране на Python речник

Можете също да използвате ламбда, когато сортирате речници на Python. Помислете за следния речник 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)])

В Python всички итерируеми: списъци, кортежи, низове и други следват нулево индексиране. Така че първият елемент е с индекс 0, вторият елемент е с индекс 1 и т.н.

Бихме искали да сортираме по стойността, която е цената на всеки елемент в речника. Във всеки кортеж в списъка price_dict_items, артикулът с индекс 1 е цената. Така че задаваме ключа на ламбда x:x[1] тъй като ще използва елемента с индекс 1, цената, за сортиране на речника.

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

В резултата елементите от речника са сортирани във възходящ ред на цените: започвайки от „бонбони“, на цена от 3 единици до „мед“, на цена от 15 единици.

▶️ За да научите повече, разгледайте това подробно ръководство за сортиране на речник на Python по ключ и стойност.

Обобщаване

И ето го! Научихте как да дефинирате ламбда функции и да ги използвате ефективно с други вградени функции на Python. Ето обобщение на основните изводи:

  • В Python ламбда са анонимни функции, които могат да приемат множество аргументи и да връщат стойност; изразът, който трябва да бъде оценен за генериране на тази върната стойност, трябва да бъде един ред код. Те могат да се използват, за да направят дефинициите на малки функции по-сбити.
  • За да дефинирате функцията ламбда, можете да използвате синтаксиса: ламбда параметър(и): върната стойност.
  • Някои от важните случаи на употреба включват използването им с функциите map(), filter() и reduce() и като ключов параметър за персонализиране на сортирането на итерируеми елементи на Python.

След това научете как да извършвате разделяне на етажи в Python.