Що таке лямбда-функція в Python?
Функція Lambda в Python програмування є анонімна функція або функція , яка не має імені. Це невелика і обмежена функція, що має не більше одного рядка. Як і звичайна функція, лямбда-функція може мати кілька аргументів з одним виразом.
У Python лямбда-вирази (або лямбда-форми) використовуються для побудови анонімних функцій. Для цього ви будете використовувати ключове слово лямбда (так само, як ви використовуєте 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. Ключове слово лямбда, що використовується для визначення анонімної функції.
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>
Що тут відбувається? Давайте подивимось на код, щоб зрозуміти далі.
Пояснення коду
- Тут ми визначаємо рядок, який ви передасте як параметр лямбда.
- Ми оголошуємо лямбду, яка викликає оператор print і друкує результат.
Але чому програма не друкує рядок, який ми передаємо? Це тому, що лямбда сама повертає об’єкт функції. У цьому прикладі лямбда не викликається функцією друку, а просто повертає об'єкт функції та місце пам'яті, де вона зберігається. Ось що друкується на консолі.
Приклад 3
Однак, якщо ви пишете таку програму:
#What a lambda returns #2x="some kind of a useless lambda"(lambda x : print(x))(x)
І запустіть його, натиснувши F5, ви побачите такий результат.
Вихід:
some kind of a useless lambda
Зараз викликається лямбда, і рядок, який ми передаємо, друкується на консолі. Але що це за дивний синтаксис, і чому визначення лямбда в дужках? Давайте зараз це зрозуміємо.
Пояснення коду
- Ось той самий рядок, який ми визначили у попередньому прикладі.
- У цій частині ми визначаємо лямбду і негайно викликаємо її, передаючи рядок як аргумент. Це щось, що називається 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
Пояснення коду
- Функція під назвою guru, яка приймає іншу функцію як перший параметр та будь-які інші аргументи, що слідують за нею.
- printer_one - це проста функція, яка друкує переданий йому параметр і повертає його.
- printer_two схожий на printer_one, але без оператора return.
- У цій частині ми викликаємо функцію гуру і передаємо функції принтера та рядок як параметри.
- Це синтаксис для досягнення четвертого кроку (тобто виклику функції гуру), але використання лямбда.
У наступному розділі ви дізнаєтесь, як використовувати лямбда-функції з map (), reduce () та filter () у Python.
Використання лямбда з вбудованими Python
Функції лямбда забезпечують елегантний та потужний спосіб виконання операцій із використанням вбудованих методів у Python. Це можливо, оскільки лямбди можна негайно викликати та передати як аргумент для цих функцій.
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 використовується для застосування певної операції до кожного елемента в послідовності. Як і фільтр (), він також приймає 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]
Пояснення коду:
- Тут ми визначаємо список, званий послідовностями, який містить деякі числа.
- Ми оголошуємо змінну з назвою filtered_result, яка буде зберігати відображені значення
- Лямбда-функція, яка працює на кожному елементі списку і повертає квадрат цього числа.
- Надрукуйте результат, повернутий функцією map.
лямбди у зменшенні ()
Функція зменшення, як map (), використовується для застосування операції до кожного елемента в послідовності. Однак він відрізняється від карти своєю роботою. Це кроки, за якими виконує функція reduce () для обчислення результату:
Крок 1) Виконайте визначену операцію з першими 2 елементами послідовності.
Крок 2) Збережіть цей результат
Крок 3) Виконайте операцію із збереженим результатом та наступним елементом у послідовності.
Крок 4) Повторюйте, поки не залишиться більше елементів.
Він також приймає два параметри:
- Функція, яка визначає операцію, яку потрібно виконати
- Послідовність (будь-який ітератор, як списки, кортежі тощо)
Наприклад, ось програма, яка повертає добуток усіх елементів у списку:
from functools import reducesequences = [1,2,3,4,5]product = reduce (lambda x, y: x*y, sequences)print(product)
Ось результат:
120
Пояснення коду:
- Імпорт зменшення з модуля functools
- Тут ми визначаємо список, званий послідовностями, який містить деякі числа.
- Ми оголошуємо змінну з назвою product, яка зберігатиме зменшене значення
- Лямбда-функція, яка працює на кожному елементі списку. Він поверне добуток цього числа відповідно до попереднього результату.
- Вивести результат, повернутий функцією зменшення.
Чому (і чому ні) використовувати лямбда-функції?
Як ви побачите в наступному розділі, лямбди розглядаються так само, як і звичайні функції на рівні інтерпретатора. Можна сказати, що лямбди забезпечують компактний синтаксис для написання функцій, які повертають один вираз.
Однак ви повинні знати, коли корисно використовувати лямбда, а коли уникати їх. У цьому розділі ви дізнаєтеся деякі принципи дизайну, які розробники python використовують під час написання лямбда.
Одним із найпоширеніших випадків використання лямбда є функціональне програмування, оскільки Python підтримує парадигму (або стиль) програмування, відому як функціональне програмування.
Це дозволяє надати функцію як параметр іншій функції (наприклад, у карті, фільтрі тощо). У таких випадках використання лямбда пропонує елегантний спосіб створити одноразову функцію та передати її як параметр.
Коли не слід використовувати лямбду?
Ніколи не слід писати складні лямбда-функції у виробничому середовищі. Кодерам, які підтримують ваш код, буде дуже складно його розшифрувати. Якщо ви виявите, що робите складні однолінійні вирази, було б набагато вищою практикою визначити належну функцію. Як найкращу практику потрібно пам’ятати, що простий код завжди кращий за складний.
Лямбда проти звичайних функцій
Як уже зазначалося, лямбди - це [vV4] [J5] просто функції, які не мають ідентифікатора, прив'язаного до них. Простішими словами, це функції без імен (отже, анонімні). Ось таблиця, щоб проілюструвати різницю між лямбдами та регулярними функціями в python.
Лямбди
Регулярні функції
Синтаксис:
lambda x : x + x
Синтаксис:
def (x) :return x + x
Лямбда-функції можуть мати лише один вираз у своєму тілі.
Регулярні функції можуть мати у своєму тілі кілька виразів і тверджень.
Лямбди не мають з ними пов’язаного імені. Ось чому вони також відомі як анонімні функції.
Звичайні функції повинні мати ім’я та підпис.
Лямбди не містять оператора повернення, оскільки тіло повертається автоматично.
Функції, яким потрібно повернути значення, повинні включати оператор return.
Пояснення відмінностей?
Основна різниця між лямбда-функцією та регулярною функцією полягає в тому, що лямбда-функція обчислює лише один вираз і дає об'єкт функції. Отже, ми можемо назвати результат лямбда-функції та використовувати його в нашій програмі, як це було зроблено в попередньому прикладі.
Звичайна функція для наведеного прикладу буде виглядати так:
def adder (x, y):return x + yprint (adder (1, 2))
Тут ми повинні визначити назву функції, яка повертає результат, коли ми її викликаємо . Лямбда-функція не містить оператора return, оскільки вона матиме лише один вираз, який завжди повертається за замовчуванням. Вам навіть не потрібно призначати лямбду, оскільки її можна негайно викликати (див. Наступний розділ). Як ви побачите в наступному прикладі, лямбди стають особливо потужними, коли ми використовуємо їх із вбудованими функціями Python.
Однак ви все ще можете задатися питанням, чим лямбди відрізняються від функції, яка повертає єдиний вираз (наприклад, наведений вище). На рівні перекладача різниці немає. Це може здатися дивним, але будь-яка лямбда-функція, яку ви визначаєте в Python, інтерпретатор розглядає як звичайну функцію.
Як ви можете бачити на схемі, обидва визначення однаково обробляються інтерпретатором python при перетворенні в байт-код. Тепер ви не можете назвати функцію лямбда- функцією, оскільки вона зарезервована Python, але будь-яке інше ім'я функції дасть той самий байт-код [KR6].
Резюме
- Лямбди, також відомі як анонімні функції, - це невеликі функції з обмеженим доступом, які не потребують імені (тобто ідентифікатора).
- Кожна лямбда-функція в Python складається з 3 основних частин:
- Ключове слово лямбда.
- Параметри (або пов'язані змінні), і
- Функція тіла.
- Синтаксис для написання лямбда: параметр лямбда: вираз
- Лямбди можуть мати будь-яку кількість параметрів, але вони не укладені в дужки
- Лямбда може мати лише 1 вираз у своєму тілі функції, яке повертається за замовчуванням.
- На рівні байт-коду не існує великої різниці між тим, як інтерпретатор обробляє лямбди та регулярні функції.
- Лямбди підтримують IIFE за допомогою цього синтаксису: (лямбда-параметр: вираз) (аргумент)
- Лямбди зазвичай використовуються з такими вбудованими пітонами:
- Фільтр: фільтр (лямбда-параметр: вираз, ітераційна послідовність)
- Карта: карта (лямбда-параметр: вираз, ітераційні послідовності)
- Зменшити: зменшити (лямбда-параметр1, параметр2: вираз, ітераційна послідовність)
- Не пишіть складні лямбда-функції у виробничому середовищі, оскільки це буде важко для тих, хто підтримує код.
[J5] Я додав таблицю, але пояснення необхідне, щоб зрозуміти відмінності.