Лямбда-функції в Python

Що таке лямбда-функції?


У Python функції є об’єктами: їх можна призначати змінним, їх можна повертати з інших функцій, зберігати в списках або dicts і передавати як параметри для інших функцій. Розглянемо, наприклад, map() вбудована функція. Його синтаксис такий map(function, iterable) і він використовується для зручного застосування function до кожного елемента iterable.

map() фактично повертає iterator об'єкт. На практиці ми представляємо результат як a list, tuple, set, dict, і т.д., як зручніше.

Припустімо, що ви хочете звести в квадрат кожен член списку за допомогою map() функція. Щоб зробити це, ми визначимо a square() і використовуйте її як параметр для map():

my_list = [1,2,3,4,5]
def square(x):
    return x**2

my_modified_list = list(map(square, my_list))
print(my_modified_list)
[1, 4, 9, 16, 25]


Однак, якщо єдине використання нашого square() створити цей список, чистіше використовувати a lambda функція:

my_list = [1,2,3,4,5]
my_modified_list = list(map(lambda x: x**2, my_list))
print(my_modified_list)
[1, 4, 9, 16, 25]

У Python lambda функції — це анонімні функції, які отримали назву та синтаксис від Алонзо Черча Лямбда-числення. Їх синтаксис:

lambda x_1,..., x_n : expression(x_1, ..., x_n)

Це створює анонімну функцію, яка отримує як вхідні дані змінні x_1, ..., x_n і повертає оцінений expression(x_1, ..., x_n).

Мета lambda functions слід використовувати як параметр для функцій, які приймають функції як параметр, як ми робили з map() вище. Python дозволяє призначати a lambda функції до змінної, але Посібник зі стилю PEP 8 радить проти цього. Якщо ви хочете призначити просту функцію змінній, краще зробити це як однорядкове визначення. Це гарантує, що кінцевий об’єкт має належне ім’я, що покращує читабельність зворотного відстеження:

anonymous_square = lambda x : x**2def named_square(x): return x**2print(anonymous_square.__name__)
print(named_square.__name__)


a = anonymous_square
b = named_square
print(a.__name__)
print(b.__name__)

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

Після останнього абзацу ви можете запитати, чому ви хочете використовувати a lambda функція. Зрештою, все, що можна зробити з a lambda функцію можна виконати за допомогою іменованої функції.

Відповідь на це така lambda функції мета це жити всередині більших виразів, що представляють обчислення. Один із способів подумати про це — за аналогією зі змінними та значеннями. Розглянемо наступний код:

x = 2

Змінна x є заповнювачем (або назвою) для цілого числа 2. Наприклад, телефонувати print(x) та print(2) дає точно такий же результат. У випадку функцій:

def square(x): return x**2

Функція square() є заповнювачем для обчислення зведення числа в квадрат. Це обчислення можна записати безіменним способом як lambda x: x**2.

Після цього філософського відступу давайте подивимося кілька прикладів застосування для lambda функції.

Використання лямбда з функцією sorted().

Команда sorted() функція сортує ітерацію. Він приймає функцію як свою key аргумент, а результат функції, застосованої до кожного елемента iterable, використовується для впорядкування елементів.

Це ідеально підходить для a lambda функція: встановивши key параметр з a lambda ми можемо сортувати за будь-якими атрибутами елементів. Наприклад, ми можемо відсортувати список імен за прізвищем:

name_list = ['Grace Hopper', 'Ada Lovelace', 'Emmy Noether', 'Marie Curie']
​
sorted_by_surname = sorted(name_list, key = lambda x: x.split()[1])
​
print(sorted_by_surname)
['Marie Curie', 'Grace Hopper', 'Ada Lovelace', 'Emmy Noether']

Використання Lambda з функцією «filter()».

Команда filter() функція має такий синтаксис: filter(function, iterable) і виводить елементи iterable які оцінюють function(element) як істинне (схоже на an WHERE речення в SQL). Ми можемо використовувати lambda функціонує як параметр для filter() щоб вибрати елементи з ітерованого.

Розглянемо наступний приклад:

num_list = list(range(0,100))
​
multiples_of_15= filter(lambda x: (x % 3 == 0) and (x % 5 == 0), num_list)
​
print(list(multiples_of_15))
[0, 15, 30, 45, 60, 75, 90]

filter() застосовується lambda функція lambda x: (x % 3 == 0) and (x % 5 == 0) до кожного елемента range(0,100)і повертає a filter об'єкт. Ми отримуємо доступ до елементів, перетворюючи його як list.

Використання Lambda з функцією map().


Наш останній приклад — те, що ми бачили у вступі — map() функція. map() синтаксис функції: map(function, iterable) та map() застосовується function до кожного елемента iterable, повертаючи a map об’єкт, до якого можна отримати доступ шляхом приведення до a list.

Ми бачили, як це можна застосувати до списків, але це можна застосувати до dicts за допомогою dict.items() метод:

my_data = {'Mary':1, 'Alice':2, 'Bob':0}
map_obj = map(lambda x: f'{x[0]} had {x[1]} little lamb', my_data.items())
print(', '.join((map_obj)))
Mary had 1 little lamb, Alice had 2 little lamb, Bob had 0 little lamb

або до рядка:

my_string = 'abcdefg'
''.join(map(lambda x: chr(ord(x)+2),my_string))
'cdefghi'

Ознайомтеся з нашим практичним практичним посібником із вивчення Git з передовими методами, прийнятими в галузі стандартами та включеною шпаргалкою. Припиніть гуглити команди Git і фактично вчитися це!

Ми можемо використовувати map() функціонувати геніальними способами – одним із прикладів є застосування багатьох функцій до одного входу.

Наприклад, припустімо, що ви створюєте API, який отримує текстовий рядок, і ви хочете застосувати до нього список функцій.

Кожна функція витягує певну особливість із тексту. Функції, які ми хочемо отримати, це кількість слів, друге слово та четверта літера четвертого слова:

def number_of_words(text):
  return len(text.split())
​
def second_word(text):
  return text.split()[1]
​
def fourth_letter_of_fourth_word(text):
  return text.split()[3][3]
​
function_list = [number_of_words, second_word, fourth_letter_of_fourth_word]
​
my_text = 'Mary had a little lamb'
map_obj = map(lambda f: f(my_text), function_list)
​
feature_list = list(map_obj)
​
print(feature_list)
[5, 'had', 't']

Висновок


У цьому посібнику ми дослідили функціональність lambda функції в Python. Ми це бачили lambda функції є анонімними функціями, які використовуються як вбудований параметр функції для інших функцій. Ми бачили деякі випадки використання, а також коли їх не варто використовувати.

Під час програмування важливо пам’ятати цитату Дональда Кнута: «Програми призначені для читання людьми і лише випадково для виконання комп’ютерами». Маючи це на увазі, lambda Функції є корисним інструментом для спрощення нашого коду, але використовувати їх потрібно з розумом.

Часова мітка:

Більше від Stackabuse