Python Лямбда-функції з ПРИКЛАДАМИ

⚡ Розумний підсумок

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

  • 🔑 Ключове слово лямбда: Лямбда-вираз записується як лямбда-аргументи: вираз, без визначення, без імені та без явного оператора return.
  • 🧮 Одинарний вираз: Тіло містить рівно один вираз, значення якого повертається автоматично, тому оператори та кілька рядків не допускаються.
  • 🔗 Вбудоване сполучення: Лямбда-вирази зазвичай передаються до map(), filter(), reduce() та sorted() для перетворення або вибору елементів у послідовності.
  • ІІФЕ: Лямбда-функцію можна визначити та викликати негайно, використовуючи шаблон (лямбда x: x + x)(2), що одразу повертає результат.
  • 🇧🇷 Проти def: Звичайні функції потребують імені та можуть містити багато операторів, тоді як лямбда-вирази обмінюють цю потужність на компактний однорядковий синтаксис.
  • 🤖 Допомога AI: Помічники штучного інтелекту, такі як GitHub Copilot, генерують лямбда-вирази для ключів map, filter та sort з короткого запиту.

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))

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 параметри:

  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]

Code Пояснення:

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

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, але будь-яка інша назва функції поверне той самий байт-код.

Поширені запитання

Так. Лямбда може використовувати умовний вираз, такий як lambda x: 'even' if x % 2 == 0 else 'odd'. Вона не може містити повний оператор if, оскільки тіло лямбда-виразу має бути одним виразом, а не блоком операторів.

Зазвичай ні. PEP 8 рекомендує використовувати def, коли функції потрібна назва, оскільки прив'язка лямбда-виразу до змінної дає їй назву, але втрачає чіткість. traceback, який надає def. Лямбда-вирази найкраще передавати безпосередньо до таких функцій, як sorted(), map() або filter().

Ні. На рівні байт-коду Python обробляє лямбда-вираз та еквівалентний def однаково, тому немає переваги в швидкості. Лямбда-вираз зберігає лише рядок коду; він не виконується швидше, ніж іменована функція, яка виконує ідентичну роботу.

Так. Лямбда може зчитувати змінні з області видимості, що оточує цикл, утворюючи замикання. Будьте обережні всередині циклу: лямбда фіксує саму змінну, а не її поточне значення, тому використовуйте аргумент за замовчуванням, наприклад, лямбда x, n=n: x + n, щоб заморозити його.

Передайте лямбда-вираз як ключовий аргумент до sorted() або list.sort(). Наприклад, sorted(users, key=lambda u: u['age']) упорядковує елементи за віком. Лямбда-вираз повідомляє Python яке значення порівнювати для кожного елемента, забезпечуючи стислий користувацький сортування без окремої іменованої функції.

Не безпосередньо, оскільки анонімна лямбда-вираз не має імені для посилання. Ви можете обійти це, присвоївши лямбда-вираз змінній та викликавши це ім'я, але звичайна функція def є більш зрозумілим та рекомендованим вибором для рекурсії.

Лямбда-функції забезпечують швидкі, вбудовані перетворення в коді штучного інтелекту та машинного навчання. Фахівець з обробки даних передає їх до функцій panda .apply(), map() та filter() для очищення або зміни форми даних, а також як ключові функції для сортування ознак, kee...ping попередня обробка компактна всередині більших навчальних конвеєрів.

GitHub Copilot пропонує повні лямбда-вирази з короткого коментаря або навколишнього коду, включаючи правильні параметри та вирази для викликів map(), filter() або sorted(). Він також може запропонувати перетворення багатослівного лямбда-виразу на чіткішу іменовану функцію, коли важлива читабельність.

Підсумуйте цей пост за допомогою: