Python Ламбда функции с ПРИМЕРИ

⚡ Умно обобщение

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

  • 🔑 Ключова дума Ламбда: Ламбда функцията се записва като ламбда аргументи: израз, без def, без име и без изричен return оператор.
  • 🧮 Единичен израз: Тялото съдържа точно един израз, чиято стойност се връща автоматично, така че оператори и множество редове не са позволени.
  • 🔗 Вградено сдвояване: Ламбдите обикновено се подават към map(), filter(), reduce() и sorted() за трансформиране или избиране на елементи в последователност.
  • IIFE: Ламбда функция може да бъде дефинирана и извикана незабавно, използвайки шаблона (ламбда x: x + x)(2), връщайки резултат веднага.
  • Срещу деф: Регулярните функции се нуждаят от име и могат да съдържат много оператори, докато ламбдите заменят тази сила с компактен, едноредов синтаксис.
  • 🤖 AI помощ: AI асистенти като GitHub Copilot генерират ламбда изрази за ключове за map, filter и sort от кратък подканващ елемент.

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

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 параметъра:

  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, 9, 121, 0, 1]

Code Обяснение:

1. Тук дефинираме списък, наречен поредици, който съдържа някои числа.

2. Декларираме променлива, наречена filtered_result, която ще съхранява картографираните стойности.

3. Ламбда функция, която се изпълнява върху всеки елемент от списъка и връща квадрата на това число.

4. Отпечатайте резултата, върнат от функцията map.

ламбда в намаление()

Функцията за намаляване, подобно на map(), се използва за прилагане на операция към всеки елемент в последователност. Въпреки това, тя се различава от картата по своята работа. Това са стъпките, последвани от функцията reduce() за изчисляване на изход:

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

Стъпка 2) Запазете този резултат.

Стъпка 3) Изпълнете операцията със запаметения резултат и следващия елемент в последователността.

Стъпка 4) Повторете, докато не останат повече елементи.

Той също така отнема два параметъра:

  1. Функция, която определя операцията, която трябва да се извърши
  2. Последователност (всеки итератор като списъци, кортежи и т.н.)

Например, ето програма, която връща произведението на всички елементи в списък:

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

Въпроси и Отговори

Да. Ламбда може да използва условен израз като lambda x: 'even' if x % 2 == 0 else 'odd'. Тя не може да съдържа пълен if оператор, защото тялото на ламбда функцията трябва да бъде единичен израз, а не блок от оператори.

Обикновено не. PEP 8 препоръчва използването на def, когато функция се нуждае от име, защото свързването на ламбда с променлива ѝ дава име, но губи по-ясната яснота. traceback, който def предоставя. Ламбдите е най-добре да се предават директно на функции като sorted(), map() или filter().

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

Да. Ламбда функцията може да чете променливи от обхващащия я обхват, образувайки затваряне. В рамките на цикъла бъдете внимателни: ламбда функцията улавя самата променлива, а не текущата ѝ стойност, така че използвайте аргумент по подразбиране, като например lambda x, n=n: x + n, за да я замразите.

Предайте ламбда като ключов аргумент на sorted() или list.sort(). Например, sorted(users, key=lambda u: u['age']) подрежда елементите по възраст. Ламбдата казва Python коя стойност да се сравнява за всеки елемент, което дава кратко персонализирано сортиране без отделна именувана функция.

Не директно, защото анонимната ламбда няма име, към което да се позовава. Можете да заобиколите това, като присвоите ламбдата на променлива и извикате това име, но нормалната def функция е по-ясният и препоръчителен избор за рекурсия.

Ламбдите захранват бързи, вградени трансформации в кода за изкуствен интелект и машинно обучение. Специалистите по данни ги предават на pandas .apply(), map() и filter() за почистване или преоформяне на данни, а като ключови функции за сортиране на характеристики, keeping предварителна обработка компактно в по-големи обучителни тръбопроводи.

GitHub Copilot предлага пълни ламбда изрази от кратък коментар или обграждащия код, включително правилните параметри и израз за извиквания на map(), filter() или sorted(). Може също така да предложи преобразуване на подробна ламбда в по-ясна именувана функция, когато четимостта е от значение.

Обобщете тази публикация с: