Функции на Python Lambda с ПРИМЕРИ

Съдържание:

Anonim

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

А Lambda Функция в Python програмиране е анонимна функция или функция, които нямат име. Това е малка и ограничена функция, която има не повече от един ред. Подобно на нормалната функция, Lambda функция може да има множество аргументи с един израз.

В Python, ламбда изрази (или ламбда форми) се използват за изграждане на анонимни функции. За целта ще използвате ключовата дума lambda (точно както използвате def за дефиниране на нормални функции). Всяка анонимна функция, която дефинирате в Python, ще има 3 основни части:

  • Ключовата дума ламбда.
  • Параметрите (или обвързаните променливи) и
  • Функционалното тяло.

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

В този урок Lambda in Python ще научите:

  • Синтаксис и примери
  • Използване на ламбда с вградени Python
  • ламбди във филтър ()
  • ламбди в картата ()
  • ламбди в намаляване ()
  • Защо (и защо не) използвам ламбда функции?
  • Ламбда срещу редовни функции

Синтаксис и примери

Формалният синтаксис за писане на ламбда функция е даден по-долу:

lambda p1, p2: expression 

Тук p1 и p2 са параметрите, които се предават на ламбда функцията. Можете да добавите толкова или малко параметри, колкото ви е необходимо.

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

Пример 1

След като вече знаете за ламбдите, нека опитаме с пример. И така, отворете вашия IDLE и въведете следното:

adder = lambda x, y: x + yprint (adder (1, 2))

Ето резултата:

3

Обяснение на кода

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

1. Ключовата дума lambda, използвана за дефиниране на анонимна функция.

2. x и y са параметрите, които предаваме на ламбда функцията.

3. Това е тялото на функцията, което добавя 2-те параметъра, които сме предали. Забележете, че това е единичен израз. Не можете да пишете множество изрази в тялото на ламбда функция.

4. Извикваме функцията и отпечатваме върнатата стойност.

Пример 2

Това беше основен пример за разбиране на основите и синтаксиса на ламбда. Нека сега се опитаме да разпечатаме ламбда и да видим резултата. Отново отворете вашия IDLE и въведете следното:

#What a lambda returnsstring='some kind of a useless lambda'print(lambda string : print(string))

Сега запазете файла си и натиснете F5, за да стартирате програмата. Това е резултатът, който трябва да получите.

Изход:

 at 0x00000185C3BF81E0>

Какво става тук? Нека да разгледаме кода, за да разберем по-нататък.

Обяснение на кода

  1. Тук дефинираме низ, който ще предадете като параметър на ламбда.
  2. Декларираме ламбда, която извиква изявление за печат и отпечатва резултата.

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

Пример 3

Ако обаче напишете програма като тази:

#What a lambda returns #2x="some kind of a useless lambda"(lambda x : print(x))(x)

И го стартирайте, като натиснете F5, ще видите изход като този.

Изход:

some kind of a useless lambda

Сега се извиква ламбда и низът, който предаваме, се отпечатва на конзолата. Но какъв е този странен синтаксис и защо дефиницията на ламбда е покрита в скоби? Нека разберем това сега.

Обяснение на кода

  1. Ето същия низ, който дефинирахме в предишния пример.
  2. В тази част дефинираме ламбда и я извикваме незабавно, като предадем низа като аргумент. Това е нещо, наречено IIFE, и ще научите повече за него в предстоящите раздели на този урок.

Пример 4

Нека разгледаме последен пример, за да разберем как се изпълняват ламбда и редовни функции. И така, отворете вашия IDLE и в нов файл въведете следното:

#A REGULAR FUNCTIONdef guru( funct, *args ):funct( *args )def printer_one( arg ):return print (arg)def printer_two( arg ):print(arg)#CALL A REGULAR FUNCTIONguru( printer_one, 'printer 1 REGULAR CALL' )guru( printer_two, 'printer 2 REGULAR CALL \n' )#CALL A REGULAR FUNCTION THRU A LAMBDAguru(lambda: printer_one('printer 1 LAMBDA CALL'))guru(lambda: printer_two('printer 2 LAMBDA CALL'))

Сега запазете файла и натиснете F5, за да стартирате програмата. Ако не сте допуснали грешки, изходът трябва да бъде нещо подобно.

Изход:

принтер 1 РЕГУЛЯРНО ПОЗВИВАНЕ

принтер 2 РЕГУЛЯРНО ПОЗВЪН

принтер 1 LAMBDA CALL

принтер 2 LAMBDA CALL

Обяснение на кода

  1. Функция, наречена гуру, която приема друга функция като първи параметър и всички други аргументи, следващи я.
  2. printer_one е проста функция, която отпечатва предадения към него параметър и го връща.
  3. printer_two е подобен на printer_one, но без оператора return.
  4. В тази част извикваме функцията гуру и предаваме функциите на принтера и низ като параметри.
  5. Това е синтаксисът за постигане на четвъртата стъпка (т.е. извикване на функцията гуру), но с помощта на ламбда.

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

Използване на ламбда с вградени Python

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

IIFE в Python Lambda

IIFE означава незабавно извикано изпълнение на функция. Това означава, че ламбда функция може да се извика веднага щом бъде дефинирана. Нека разберем това с пример; запалете вашия IDLE и напишете следното:

 (lambda x: x + x)(2) 

Ето обяснението за изхода и кода:

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

ламбди във филтър ()

Функцията за филтриране се използва за избор на някои конкретни елементи от поредица от елементи. Последователността може да бъде всеки итератор като списъци, набори, кортежи и т.н.

Елементите, които ще бъдат избрани, се основават на някои предварително дефинирани ограничения. Необходими са 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 се използва за прилагане на определена операция към всеки елемент в последователност. Подобно на 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, 121, 0, 1]

[KR1]

Обяснение на кода:

  1. Тук дефинираме списък, наречен последователности, който съдържа някои числа.
  2. Декларираме променлива, наречена filtered_result, която ще съхранява картографираните стойности
  3. Ламбда функция, която работи върху всеки елемент от списъка и връща квадрата на това число.
  4. Отпечатайте резултата, върнат от функцията map.

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

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

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

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

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

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

Също така са необходими два параметъра:

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

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

from functools import reducesequences = [1,2,3,4,5]product = reduce (lambda x, y: x*y, sequences)print(product)

Ето резултата:

120

Обяснение на кода:

  1. Импортиране на намаление от модула functools
  2. Тук дефинираме списък, наречен последователности, който съдържа някои числа.
  3. Декларираме променлива, наречена продукт, която ще съхранява намалената стойност
  4. Ламбда функция, която работи на всеки елемент от списъка. Той ще върне произведението от това число според предишния резултат.
  5. Отпечатайте резултата, върнат от функцията за намаляване.

Защо (и защо не) използвам ламбда функции?

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

Трябва обаче да знаете кога е добра идея да използвате ламбда и кога да ги избягвате. В този раздел ще научите някои от принципите на проектиране, използвани от разработчиците на python, когато пишат ламбда.

Един от най-често използваните случаи за ламбда е във функционалното програмиране, тъй като Python поддържа парадигма (или стил) на програмиране, известна като функционално програмиране.

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

Кога не трябва да използвате Lambda?

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

Ламбда срещу редовни функции

Както беше посочено по-горе, ламбдите са [vV4] [J5] просто функции, които нямат свързан идентификатор. С по-прости думи те са функции без имена (следователно анонимни). Ето таблица, която илюстрира разликата между ламбдите и редовните функции в python.

Ламбди

Редовни функции

Синтаксис:

lambda x : x + x 

Синтаксис:

def (x) :return x + x

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

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

Lambdas нямат име, свързано с тях. Ето защо те са известни и като анонимни функции.

Редовните функции трябва да имат име и подпис.

Lambdas не съдържат оператор за връщане, тъй като тялото се връща автоматично.

Функциите, които трябва да върнат стойност, трябва да включват оператор return.

Обяснение на разликите?

Основната разлика между ламбда и обикновена функция е, че ламбда функцията изчислява само един израз и дава функционален обект. Следователно можем да назовем резултата от ламбда функцията и да го използваме в нашата програма, както направихме в предишния пример.

Редовна функция за горния пример ще изглежда така:

def adder (x, y):return x + yprint (adder (1, 2))

Тук трябва да дефинираме име за функцията, която връща резултата, когато го извикаме . Ламбда функция не съдържа оператор return, защото ще има само един израз, който винаги се връща по подразбиране. Дори не е нужно да задавате ламбда, тъй като тя може да бъде незабавно извикана (вижте следващия раздел). Както ще видите в следващия пример, ламбдите стават особено мощни, когато ги използваме с вградените функции на Python.

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

Както можете да видите на диаграмата, двете дефиниции се обработват по един и същи начин от интерпретатора на python, когато се преобразуват в байт код. Сега не можете да назовавате функция на лямбда, защото тя е запазена от Python, но всяко друго име на функция ще даде същия байт код [KR6].

Обобщение

  • Lambdas, известни също като анонимни функции, са малки, ограничени функции, които не се нуждаят от име (т.е. идентификатор).
  • Всяка ламбда функция в Python има 3 основни части:
  • Ключовата дума ламбда.
  • Параметрите (или обвързаните променливи) и
  • Функционалното тяло.
  • Синтаксисът за писане на ламбда е: ламбда параметър: израз
  • Ламбдите могат да имат произволен брой параметри, но те не са затворени в скоби
  • Ламбда може да има само 1 израз в тялото си на функция, който се връща по подразбиране.
  • На ниво байт код няма голяма разлика между начина, по който интерпретаторът обработва ламбдите и редовните функции.
  • Lambdas поддържат IIFE чрез този синтаксис: (ламбда параметър: израз) (аргумент)
  • Lambdas често се използват със следните вградени python:
  • Филтър: филтър (ламбда параметър: израз, итерируема последователност)
  • Карта: карта (ламбда параметър: израз, итерируеми последователности)
  • Намаляване: намаляване (ламбда параметър1, параметър2: израз, итерируема последователност)
  • Не пишете сложни ламбда функции в производствена среда, защото ще е трудно за поддържащите кода.

[J5] Добавих таблица, но обяснението е необходимо, за да се разберат разликите.