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