Python Ламбда функции с ПРИМЕРИ
Какво представлява ламбда функцията 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))
Ето резултата:
3
Обяснение на кода
Тук дефинираме променлива, която ще съдържа резултата, върнат от ламбда функцията.
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>
какво се случва тук Нека да разгледаме кода, за да разберем по-нататък.
Обяснение на кода
- Тук дефинираме a низ който ще предадете като параметър на ламбда.
- Ние декларираме ламбда, която извиква оператор за печат и отпечатва резултата.
Но защо програмата не отпечатва низа, който предаваме? Това е така, защото самата ламбда връща функционален обект. В този пример ламбда не е битие нарича чрез функцията за печат, но просто връщане функционалния обект и мястото в паметта, където се съхранява. Това е, което се отпечатва на конзолата.
Пример 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
Сега ламбда се извиква и низът, който предаваме, се отпечатва на конзолата. Но какъв е този странен синтаксис и защо ламбда дефиницията е в скоби? Нека разберем това сега.
Обяснение на кода
- Ето същия низ, който дефинирахме в предишния пример.
- В тази част ние дефинираме ламбда и я извикваме веднага, като предаваме низа като аргумент. Това е нещо, наречено 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
Обяснение на кода
- Функция, наречена guru, която приема друга функция като първи параметър и всички други аргументи след нея.
- printer_one е проста функция, която отпечатва параметъра, предаден й и го връща.
- printer_two е подобен на printer_one, но без израза return.
- В тази част извикваме функцията guru и предаваме функциите на принтера и низ като параметри.
- Това е синтаксисът за постигане на четвъртата стъпка (т.е. извикване на функцията guru), но с помощта на ламбда.
В следващия раздел ще научите как да използвате ламбда функции с map(), намаляване (), намлява филтър() 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]
Обяснение на кода:
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]
[KR1]
Обяснение на кода:
- Тук дефинираме списък, наречен последователности, който съдържа някои числа.
- Ние декларираме променлива, наречена filtered_result, която ще съхранява картографираните стойности
- Ламбда функция, която се изпълнява на всеки елемент от списъка и връща квадрата на това число.
- Отпечатайте резултата, върнат от функцията карта.
ламбда в намаление()
Функцията за намаляване, подобно на 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
Обяснение на кода:
- Импортирайте намаление от модула functools
- Тук дефинираме списък, наречен последователности, който съдържа някои числа.
- Ние декларираме променлива, наречена product, която ще съхранява намалената стойност
- Ламбда функция, която се изпълнява на всеки елемент от списъка. Той ще върне произведението на това число според предишния резултат.
- Отпечатайте резултата, върнат от функцията за намаляване.
Защо (и защо не) да използвате ламбда функции?
Както ще видите в следващия раздел, ламбда се третират по същия начин като обикновените функции на ниво интерпретатор. В известен смисъл може да се каже, че ламбда предоставят компактен синтаксис за писане на функции, които връщат един израз.
Все пак трябва да знаете кога е добра идея да използвате ламбда и кога да ги избягвате. В този раздел ще научите някои от принципите на проектиране, използвани от разработчиците на Python при писане на ламбда.
Един от най-честите случаи на използване на ламбда е във функционалното програмиране като Python поддържа парадигма (или стил) на програмиране, известен като функционално програмиране.
Тя ви позволява да предоставите функция като параметър на друга функция (например в карта, филтър и т.н.). В такива случаи използването на ламбда предлага елегантен начин за създаване на еднократна функция и предаването й като параметър.
Кога не трябва да използвате Lambda?
Никога не трябва да пишете сложни ламбда функции в производствена среда. Ще бъде много трудно за програмистите, които поддържат вашия код, да го дешифрират. Ако откриете, че правите сложни едноредови изрази, би било много по-добра практика да дефинирате правилна функция. Като най-добра практика трябва да запомните, че простият код винаги е по-добър от сложния код.
Ламбда срещу редовни функции
Както беше посочено по-рано, ламбда са [vV4][J5] просто функции, които нямат идентификатор, обвързан с тях. С по-прости думи, те са функции без имена (следователно анонимни). Ето таблица, която илюстрира разликата между ламбда и обикновените функции в 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, но всяко друго име на функция ще даде същия байткод [KR6].
Oбобщение
- Ламбда, известни също като анонимни функции, са малки, ограничени функции, които не се нуждаят от име (т.е. идентификатор).
- Всяка ламбда функция в Python има 3 основни части:
- Ключовата дума ламбда.
- Параметрите (или обвързаните променливи) и
- Функционалното тяло.
- Синтаксисът за писане на ламбда е: ламбда параметър: израз
- Ламбда може да има произволен брой параметри, но те не са затворени в скоби
- Ламбда може да има само 1 израз в тялото на функцията, който се връща по подразбиране.
- На ниво байт код няма голяма разлика между това как ламбда и обикновените функции се обработват от интерпретатора.
- Ламбда поддържат IIFE чрез този синтаксис: (ламбда параметър: израз) (аргумент)
- Lambdas обикновено се използват със следните вградени Python:
- Филтър: филтър (ламбда параметър: израз, итерируема последователност)
- Карта: карта (ламбда параметър: израз, итерируеми последователности)
- Намаляване: намаляване (ламбда параметър1, параметър2: израз, итерируема последователност)
- Не пишете сложни ламбда функции в производствена среда, защото ще бъде трудно за поддържащите кода.
[J5]Добавих таблица, но обяснението е необходимо, за да разберем разликите.
