Python Лямбда-функції з ПРИКЛАДАМИ
⚡ Розумний підсумок
Лямбда-функції в Python – це невеликі анонімні функції, визначені за допомогою ключового слова lambda замість def. Вони містять один вираз, приймають будь-яку кількість аргументів і часто передаються безпосередньо до вбудованих функцій, таких як map(), filter() та sorted().

Що таке лямбда-функція Python?
A Лямбда-функція в Python програмування є анонімною функцією або функцією без імені. Це невелика та обмежена функція, що містить не більше одного рядка. Як і звичайна функція, лямбда-функція може мати кілька аргументів з одним виразом.
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. Ключове слово лямбда, яке використовується для визначення анонімної функції.
2. x і y – це параметри, які ми передаємо лямбда-функції.
3. Це тіло функції, яка додає 2 параметри, які ми передали. Зверніть увагу, що це один вираз. Ви не можете написати кілька операторів у тілі лямбда-функції.
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), але з використанням лямбда-виразів.
У наступному розділі ви дізнаєтеся, як використовувати лямбда-функції з карта (), зменшити () та filter () in Python.
Використання лямбда з Python вбудовані
Лямбда-функції забезпечують елегантний і потужний спосіб виконання операцій за допомогою вбудованих методів Python. Це можливо, оскільки лямбда-вирази можна негайно викликати та передати як аргумент до цих функцій.
ІІФЕ в Python Лямбда
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 |
| Лямбда-функції можуть мати лише одне вираження у своєму тілі. | Звичайні функції можуть мати кілька виразів і операторів у своєму тілі. |
| Лямбда-функції не мають назви. Саме тому їх також називають анонімними функціями. | Звичайні функції повинні мати назву та підпис. |
| Лямбда-вирази не містять оператора return, оскільки тіло повертається автоматично. | Функції, які повинні повертати значення, повинні містити оператор return. |
Пояснення відмінностей
Основна відмінність між лямбда-функцією та звичайною функцією полягає в тому, що лямбда-функція обчислює лише один вираз і дає об’єкт функції. Отже, ми можемо назвати результат лямбда-функції та використовувати його в нашій програмі, як ми робили в попередньому прикладі.
Звичайна функція для наведеного вище прикладу виглядатиме так:
def adder (x, y): return x + y print (adder (1, 2))
Тут ми повинні визначити a ім'я для функції, яка Умови повернення результат, коли ми call це. Лямбда-функція не містить оператора return, оскільки вона матиме лише один вираз, який завжди повертається за замовчуванням. Вам навіть не потрібно призначати лямбда-функцію, оскільки її можна викликати негайно (див. попередній розділ). Як ви побачите, лямбда-функції стають особливо потужними, коли ми використовуємо їх з Pythonвбудовані функції.
Однак ви можете все ще дивуватися, чим лямбда-вирази відрізняються від функції, яка повертає один вираз (як наведений вище). На рівні перекладача особливої різниці немає. Це може здатися дивним, але будь-яка лямбда-функція, яку ви визначаєте в Python розглядається інтерпретатором як звичайна функція.
На рівні байт-коду обидва визначення обробляються однаково Python інтерпретатор. Тепер ви не можете назвати функцію лямбда оскільки він зарезервований Python, але будь-яка інша назва функції поверне той самий байт-код.
