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>

Що тут відбувається? Давайте подивимося на код, щоб зрозуміти далі.

Пояснення коду

  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

Тепер викликається лямбда, і рядок, який ми передаємо, друкується на консолі. Але що це за дивний синтаксис і чому лямбда-визначення взято в дужки? Давайте розберемося в цьому зараз.

Пояснення коду

  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

Пояснення коду

  1. Функція під назвою guru, яка приймає іншу функцію як перший параметр і будь-які інші аргументи після неї.
  2. printer_one — проста функція, яка друкує переданий їй параметр і повертає його.
  3. printer_two схожий на printer_one, але без оператора return.
  4. У цій частині ми викликаємо функцію guru і передаємо функції принтера та рядок як параметри.
  5. Це синтаксис для досягнення четвертого кроку (тобто виклику функції 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 параметри:

  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]

[KR1]

Пояснення коду:

  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

Пояснення коду:

  1. Імпорт скорочення з модуля functools
  2. Тут ми визначаємо список, званий послідовностями, який містить деякі числа.
  3. Ми оголошуємо змінну під назвою product, яка зберігатиме приведене значення
  4. Лямбда-функція, яка виконується для кожного елемента списку. Він поверне добуток цього числа на попередній результат.
  5. Вивести результат, отриманий функцією зменшення.

Навіщо (і чому ні) використовувати лямбда-функції?

Як ви побачите в наступному розділі, лямбда обробляються так само, як і звичайні функції на рівні інтерпретатора. У певному сенсі можна сказати, що лямбда-вирази забезпечують компактний синтаксис для написання функцій, які повертають один вираз.

Однак ви повинні знати, коли доцільно використовувати лямбда-випромінювання, а коли їх уникати. У цьому розділі ви дізнаєтесь про деякі принципи проектування, які використовують розробники 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]Я додав таблицю, але пояснення необхідні, щоб зрозуміти відмінності.

Щоденний інформаційний бюлетень Guru99

Розпочніть свій день з останніх та найважливіших новин про штучний інтелект, які ви можете знайти просто зараз.