Python Ламбда функции с ПРИМЕРИ
⚡ Умно обобщение
Ламбда функции в Python са малки анонимни функции, дефинирани с ключовата дума lambda вместо def. Те съдържат един израз, приемат произволен брой аргументи и често се предават директно на вградени функции като map(), filter() и sorted().

Какво представлява ламбда функцията Python?
A Ламбда функция в Python програмирането е анонимна функция или функция без име. Това е малка и ограничена функция с не повече от един ред. Точно като нормална функция, функцията Lambda може да има множество аргументи с един израз.
In Python, ламбда изрази (или ламбда форми) се използват за конструиране на анонимни функции. За да направите това, ще използвате ламбда ключова дума (точно както използвате деф за дефиниране на нормални функции). Всяка анонимна функция, която дефинирате в Python ще има 3 основни части:
- Ключовата дума ламбда.
- Параметрите (или обвързаните променливи) и
- Функционалното тяло.
Една ламбда функция може да има произволен брой параметри, но тялото на функцията може да съдържа само един изразяване. Освен това ламбда се записва в един ред код и може да бъде извикана незабавно. Ще видите всичко това в действие в предстоящите примери.
Синтаксис и примери
Формалният синтаксис за писане на ламбда функция е даден по-долу:
lambda p1, p2: expression
Тук p1 и p2 са параметрите, които се предават на ламбда функцията. Можете да добавите толкова или малко параметри, колкото ви е необходимо.
Обърнете внимание обаче, че не използваме скоби около параметрите, както правим с обикновените функции. Последната част (израз) е всеки валиден Python израз, който работи с параметрите, които предоставяте на функцията.
Пример 1
След като вече знаете за ламбда, нека опитаме с пример. Така че, отворете своя IDLE и въведете следното:
adder = lambda x, y: x + y print (adder (1, 2))
Code Обяснение
Тук дефинираме променлива, която ще съдържа резултата, върнат от ламбда функцията.
1. Ключовата дума lambda, използвана за дефиниране на анонимна функция.
2. x и y са параметрите, които предаваме на ламбда функцията.
3. Това е тялото на функцията, което добавя двата параметъра, които сме предали. Забележете, че това е един израз. Не можете да пишете множество изрази в тялото на ламбда функция.
4. Извикваме функцията и отпечатваме върнатата стойност.
Пример 2
Това беше основен пример за разбиране на основите и синтаксиса на ламбда. Нека сега се опитаме да отпечатаме ламбда и да видим резултата. Отново отворете вашия IDLE и въведете следното:
#What a lambda returns string='some kind of a useless lambda' print(lambda string : print(string))
Сега запазете файла си и натиснете F5, за да стартирате програмата. Това е резултатът, който трябва да получите.
Изход:
<function <lambda> at 0x00000185C3BF81E0>
Какво се случва тук? Нека разгледаме кода, за да разберем по-добре.
Code Обяснение:
1. Тук дефинираме a низ който ще предадете като параметър на ламбда функцията.
2. Декларираме ламбда, която извиква оператор print и отпечатва резултата.
Но защо програмата не отпечатва низа, който предаваме? Това е така, защото самата ламбда функция връща функционален обект. В този пример ламбда функцията не се извежда. нарича от функцията за печат, а е просто връщане функционалният обект и местоположението в паметта, където е съхранен. Това е, което се отпечатва на конзолата.
Пример 3
Ако обаче напишете програма като тази:
#What a lambda returns #2 x="some kind of a useless lambda" (lambda x : print(x))(x)
И го стартирайте, като натиснете F5, ще видите резултат като този.
Изход:
some kind of a useless lambda
Сега се извиква ламбда функцията и низът, който предаваме, се отпечатва в конзолата. Но какъв е този странен синтаксис и защо дефиницията на ламбда функцията е оградена в скоби? Нека разберем това сега.
Code Обяснение:
1. Ето същият низ, който дефинирахме в предишния пример.
2. В тази част дефинираме ламбда функция и я извикваме директно, като ѝ предаваме низа като аргумент. Това се нарича IIFE и ще научите повече за него в следващите раздели на този урок.
Пример 4
Нека разгледаме последен пример, за да разберем как се изпълняват ламбда изразите и обикновените функции. И така, отворете вашия IDLE и в нов файл въведете следното:
#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'))
Сега запазете файла и натиснете F5, за да стартирате програмата. Ако не сте допуснали грешки, резултатът би трябвало да е нещо подобно.
Изход:
printer 1 REGULAR CALL printer 2 REGULAR CALL printer 1 LAMBDA CALL printer 2 LAMBDA CALL
Code Обяснение:
1. Функция, наречена guru, която приема друга функция като първи параметър и всички останали аргументи след нея.
2. printer_one е проста функция, която отпечатва предадения ѝ параметър и го връща.
3. printer_two е подобен на printer_one, но без оператора return.
4. В тази част извикваме функцията guru и предаваме функциите за печат и низ като параметри.
5. Това е синтаксисът за постигане на четвъртата стъпка (т.е. извикване на функцията guru), но с използване на ламбда изрази.
В следващия раздел ще научите как да използвате ламбда функции с карта(), намали (), и филтър() in Python.
Използване на ламбда с Python вградени
Ламбда функциите предоставят елегантен и мощен начин за извършване на операции с помощта на вградени методи в Python. Възможно е, защото ламбда могат да бъдат извикани незабавно и предадени като аргумент на тези функции.
IIFE в Python Lambda
IIFE стойки за незабавно извикано изпълнение на функция. Това означава, че ламбда функцията може да се извика веднага щом бъде дефинирана. Нека разберем това с пример; стартирайте вашия IDLE и въведете следното:
(lambda x: x + x)(2)
Ето изхода и обяснението на кода:
Тази способност на ламбда да бъдат извиквани незабавно ви позволява да ги използвате във функции като map() и reduce(). Полезно е, защото може да не искате да използвате тези функции отново.
ламбда във filter()
Филтърната функция се използва за избиране на определени елементи от последователност от елементи. Последователността може да бъде всеки итератор като списъци, набори, кортежи и т.н.
Елементите, които ще бъдат избрани, се базират на предварително зададено ограничение. Необходими са 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]
Code Обяснение:
1. В първия израз дефинираме списък, наречен последователности, който съдържа някои числа.
2. Тук декларираме променлива, наречена filtered_result, която ще съхранява филтрираните стойности, върнати от функцията filter().
3. Ламбда функция, която се изпълнява на всеки елемент от списъка и връща true, ако е по-голямо от 4.
4. Отпечатайте резултата, върнат от филтърната функция.
ламбда в map()
Функцията map се използва за прилагане на определена операция към всеки елемент в поредица. Подобно на filter(), тя също приема 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, 9, 121, 0, 1]
Code Обяснение:
1. Тук дефинираме списък, наречен поредици, който съдържа някои числа.
2. Декларираме променлива, наречена filtered_result, която ще съхранява картографираните стойности.
3. Ламбда функция, която се изпълнява върху всеки елемент от списъка и връща квадрата на това число.
4. Отпечатайте резултата, върнат от функцията map.
ламбда в намаление()
Функцията за намаляване, подобно на map(), се използва за прилагане на операция към всеки елемент в последователност. Въпреки това, тя се различава от картата по своята работа. Това са стъпките, последвани от функцията reduce() за изчисляване на изход:
Стъпка 1) Извършете дефинираната операция върху първите 2 елемента от последователността.
Стъпка 2) Запазете този резултат.
Стъпка 3) Изпълнете операцията със запаметения резултат и следващия елемент в последователността.
Стъпка 4) Повторете, докато не останат повече елементи.
Той също така отнема два параметъра:
- Функция, която определя операцията, която трябва да се извърши
- Последователност (всеки итератор като списъци, кортежи и т.н.)
Например, ето програма, която връща произведението на всички елементи в списък:
from functools import reduce sequences = [1,2,3,4,5] product = reduce (lambda x, y: x*y, sequences) print(product)
Ето резултата:
120
Code Обяснение:
1. Импортирайте reduce от модула functools.
2. Тук дефинираме списък, наречен поредици, който съдържа някои числа.
3. Декларираме променлива, наречена product, която ще съхранява редуцираната стойност.
4. Ламбда функция, която се изпълнява върху всеки елемент от списъка. Тя ще върне произведението на това число съгласно предишния резултат.
5. Изведете резултата, върнат от функцията reduce.
Защо (и защо не) да използвате ламбда функции?
Както ще видите в следващия раздел, ламбда се третират по същия начин като обикновените функции на ниво интерпретатор. В известен смисъл може да се каже, че ламбда предоставят компактен синтаксис за писане на функции, които връщат един израз.
Въпреки това, трябва да знаете кога е добра идея да използвате ламбда изрази и кога да ги избягвате. В този раздел ще научите някои от принципите на проектиране, използвани от Python разработчици при писане на ламбда изрази.
Един от най-често срещаните случаи на употреба на ламбда изрази е във функционалното програмиране, тъй като Python поддържа парадигма (или стил) на програмиране, известен като функционално програмиране.
Това ви позволява да предоставите функция като параметър на друга функция (например в map, filter и др.). В такива случаи използването на ламбда изрази предлага елегантен начин за създаване на еднократна функция и предаването ѝ като параметър.
Кога не трябва да използвате Lambda?
Никога не трябва да пишете сложни ламбда функции в производствена среда. Ще бъде много трудно за програмистите, които поддържат вашия код, да го дешифрират. Ако откриете, че правите сложни едноредови изрази, би било много по-добра практика да дефинирате правилна функция. Като най-добра практика трябва да запомните, че простият код винаги е по-добър от сложния код.
Ламбда срещу редовни функции
Както беше посочено по-рано, ламбдите са просто функции, които нямат идентификатор, свързан с тях. С по-прости думи, те са функции без имена (следователно, анонимни). Ето таблица, която илюстрира разликата между ламбдите и обикновените функции в Python.
| Ламбда | Редовни функции |
|---|---|
Синтаксис:
lambda x : x + x
|
Синтаксис:
def (x) : return x + x |
| Ламбда функциите могат да имат само един израз в тялото си. | Редовните функции могат да имат множество изрази и изрази в тялото си. |
| Ламбдите нямат име, свързано с тях. Ето защо те са известни още като анонимни функции. | Редовните функции трябва да имат име и подпис. |
| Ламбдите не съдържат израз за връщане, тъй като тялото се връща автоматично. | Функциите, които трябва да връщат стойност, трябва да включват оператор за връщане. |
Обяснение на разликите
Основната разлика между ламбда и обикновената функция е, че ламбда функцията оценява само един израз и дава функционален обект. Следователно можем да назовем резултата от ламбда функцията и да го използваме в нашата програма, както направихме в предишния пример.
Редовна функция за горния пример би изглеждала така:
def adder (x, y): return x + y print (adder (1, 2))
Тук трябва да дефинираме a име за функцията, която Постъпления резултатът, когато ние повикване Ламбда функцията не съдържа оператор за връщане, защото ще има само един израз, който винаги се връща по подразбиране. Дори не е нужно да присвоявате ламбда, тъй като тя може да бъде извикана веднага (вижте предишния раздел). Както ще видите, ламбдите стават особено мощни, когато ги използваме с Pythonвградени функции.
Все пак може би все още се чудите как ламбда се различават от функция, която връща един израз (като този по-горе). На ниво преводач няма голяма разлика. Може да звучи изненадващо, но всяка ламбда функция, която дефинирате в Python се третира като нормална функция от интерпретатора.
На ниво байткод, двете дефиниции се обработват по един и същи начин от Python интерпретатор. Сега не можете да назовете функция ламбда тъй като е запазено от Python, но всяко друго име на функция ще даде същия байткод.
