Передача лямбда-функции в качестве аргумента в Python: примеры с map, filter, sorted и reduce

0
23

Содержание

Краткая памятка по лямбда-функциям в Python

  1. Лямбда — это анонимная функция, создаваемая с помощью ключевого слова lambda.
  2. Синтаксис: lambda аргументы: выражение.
  3. Лямбда может принимать любое количество аргументов, но возвращает только одно выражение.
  4. Используйте лямбду для простых операций, чтобы не загромождать код.
  5. Лямбды идеально подходят для функций высшего порядка: map(), filter(), sorted(), reduce().
  6. Не присваивайте лямбду переменной — используйте def для именованных функций.
  7. Внутри лямбды можно использовать тернарный оператор (if else).
  8. Лямбда не поддерживает циклы, try/except и множественные инструкции.
  9. Для сложной логики всегда используйте обычные функции (def).
  10. Лямбды делают код более лаконичным, но могут снижать читаемость при злоупотреблении.

Что такое лямбда в Python?

ПОдготовка к - изображение номер один
ПОдготовка к — изображение номер один

Прежде чем переходить как разбору понятия лямбда в Python, попробуем понять, чем является обычная функция Python на более глубоком уровне.

Для этого потребуется немного поменять направление мышление. Как вы знаете, все в Python является объектом.

Создается объект Python типа int, который сохраняет значение 5. x же является символом, который ссылается на объект.

Теперь проверим тип x и адрес, на которой он ссылается. Это можно сделать с помощью встроенных функций type и id.

В итоге x ссылается на объект типа int, а расположен он по адресу, который вернула функция id.

Оказывается, в Python есть класс function, а только что определенная функция f — это его экземпляр. Так же как x был экземпляром класса integer. Другими словами, о функциях можно думать как о переменных. Разница лишь в том, что переменные хранят данные, а функции — код.

Это же значит, что функции можно передать в качестве аргументов другим функциям или даже использовать их как тип возвращаемого значения.

Попробуйте разобраться самостоятельно с тем, что делает этот код, прежде чем читать дальше.

Итак, modify_list — это функция, которая принимает список L и функцию fn в качестве аргументов. Затем она перебирает список элемент за элементом и применяет функцию к каждому из них.

Это общий способ изменения объектов списка, ведь он позволяет передать функцию, которая займется преобразованием. Так, если передать modify_list функцию f, то результатом станет список, где все значения будут возведены в квадрат.

Но можно передать и любую другую, которая изменит оригинальный список другим способом. Это очень мощный инструмент.

Теперь, когда с основами разобрались, стоит перейти к лямбда. Лямбда в Python — это просто еще один способ определения функции. Вот базовый синтаксис лямбда-функции в Python:

Лямбда принимает любое количество аргументов (или ни одного), но состоит из одного выражения. Возвращаемое значение — значение, которому присвоена функция. Например, если нужно определить функцию f из примера выше, то это можно сделать вот так:

Но возникает вопрос: а зачем нужны лямбда-функции, если их можно объявлять традиционным образом? Но на самом деле, они полезны лишь в том случае, когда нужна одноразовая функция. Такие функции еще называют анонимными. И, как вы увидите дальше, есть масса ситуаций, где они оказываются нужны.

Лямбда-функция имеет следующий синтаксис.

Лямбда-функция в - изображение номер два
Лямбда-функция в — изображение номер два

Лямбда-функции могут иметь любое количество аргументов, но у каждой может быть только одно выражение. Выражение вычисляется и возвращается. Эти функции могут быть использованы везде, где требуется объект-функция.

Пример лямбда-функции.

Python - изображение номер три
Python — изображение номер три

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

В вышеуказанном коде lambda x: x*2 — это лямбда-функция. Здесь x — это аргумент, а x*2 — это выражение, которое вычисляется и возвращается.

Эта функция безымянная. Она возвращает функциональный объект с идентификатором double. Сейчас мы можем считать её обычной функцией.

  • Эта функция может иметь любое количество аргументов, но вычисляет и возвращает только одно значение
  • Лямбда-функции применимы везде, где требуются объекты-функции
  • Вы должны помнить, что синтаксически лямбда-функция ограничена, позволяет представить всего одно выражение
  • Они имеют множество вариантов применения в конкретных областях программирования, наряду с другими типами выражений, используемых в функциях.
ЧИТАТЬ ТАКЖЕ:  Python: язык программирования высокого уровня с динамической типизацией и интерпретацией

Эта функция может иметь любое количество аргументов, но вычисляет и возвращает только одно значение

Вы должны помнить, что синтаксически лямбда-функция ограничена, позволяет представить всего одно выражение

Они имеют множество вариантов применения в конкретных областях программирования, наряду с другими типами выражений, используемых в функциях.

Примеры лямбда-функций

Лямбда функции в - изображение номер четыре
Лямбда функции в — изображение номер четыре

Теперь рассмотрим самые распространенные примеры использования лямбда-функций.

Лямбда с несколькими аргументами

How to use the - изображение номер пять
How to use the — изображение номер пять

А если их должно быть несколько, то достаточно лишь разделить значения запятыми. Предположим, что нужна функция, которая берет два числовых аргумента и возвращает их произведение.

Лямбда-функция без аргументов

27 - изображение номер шесть
27 — изображение номер шесть

Допустим, нужно создать функцию без аргументов, которая бы возвращала True. Этого можно добиться с помощью следующего кода.

Несколько лямбда-функций

Python очно (дом), модуль 4 (2) - изображение номер семь
Python очно (дом), модуль 4 (2) — изображение номер семь

В определенный момент возникнет вопрос: а можно ли иметь лямбда-функцию из нескольких строк.

Лямбда-функции в Python всегда принимают только одно выражение. Если же их несколько, то лучше создать обычную функцию.

Лямбда-функция и сортировка списков

Python 3 - изображение номер восемь
Python 3 — изображение номер восемь

Сортировка списка — базовая операция в Python. Если речь идет о списке чисел или строк, то процесс максимально простой. Подойдут встроенные функции sort и sorted.

Но иногда имеется список кастомных объектов, сортировать которые нужно на основе значений одного из полей. В таком случае можно передать параметр key в sort или sorted. Он и будет являться функцией.

Функция применяется ко всем элементам объекта, а возвращаемое значение — то, на основе чего выполнится сортировка. Рассмотрим пример. Есть класс Employee.

Предположим, что мы хотим отсортировать его на основе поля age сотрудников. Вот что нужно сделать для этого:

Лямбда-выражение было использовано в качестве параметра key вместо отдельного ее определения и затем передачи в функцию sort.

Лямбда и списковое включение

Lambda - изображение номер девять
Lambda — изображение номер девять

В этом примере мы будем использовать лямбда-функцию со списковым включением и лямбда-функцию с циклом for. Мы выведем на экран таблицу из 10 элементов.

Лямбда и условные операторы

Многопоточные приложения - презентация онлайн - изображение номер десять
Многопоточные приложения — презентация онлайн — изображение номер десять

Давайте рассмотрим использование условий if-else в лямбда-функции. Как вы знаете, Python позволяет нам использовать однострочные условия, и именно их мы можем помещать в лямбда-функцию для обработки возвращаемого результата.

Например, есть две цифры, и вы должны определить, какая из них представляет наибольшее число.

Лямбда и множественные операторы

Лямбда-выражения в - изображение номер одиннадцать
Лямбда-выражения в — изображение номер одиннадцать

Лямбда-функции не допускают использования нескольких операторов, однако мы можем создать две лямбда-функции, а затем вызвать вторую лямбда-функцию в качестве параметра для первой функции. Давайте попробуем найти второй по величине элемент, используя лямбду.

В предыдущем примере, мы создали лямбда-функцию, которая сортирует каждый вложенный список в заданном списке. Затем этот список проходит как параметр для второй лямбда-функции, которая возвращает элемент n-2 из отсортированного списка, где n — длина вложенного списка.

Делегаты (C# - изображение номер двенадцать
Делегаты (C# — изображение номер двенадцать

Пара слов о выражениях и инструкциях

Как уже упоминалось, лямбда могут иметь только одно выражение (expression) в теле.

Выражение и инструкции — две разные вещи, в которых часто путаются. В программировании инструкцией является строка кода, выполняющая что-то, но не генерирующая значение.

Например, инструкция if или циклы for и while являются примерами инструкций. Заменить инструкцию на значение попросту невозможно.

А вот выражения — это значения. Запросто можно заменить все выражения в программе на значения, и программа продолжит работать корректно.

  • 3 + 5 — выражение со значением 8
  • 10 > 5 — выражение со значением True
  • True and (5 < 3) — выражение со значением False

Тело лямбда-функции должно являться выражением, поскольку его значение будет тем, что она вернет. Обязательно запомните это для работы с лямбда-функциями в будущем.

Различие между обычной функцией и лямбда-функцией

Traditional - изображение номер четырнадцать
Traditional — изображение номер четырнадцать

Рассмотрим пример и попробуем понять различие между определением (Def) для обычной функции и lambda-функции. Этот код возвращает заданное значение, возведенное в куб:

Как показано в примере выше, обе представленные функции, defined_cube() и lambda_cube(), ведут себя одинаково, как и предполагалось.

  • Без использования лямбды: Здесь обе функции возвращают заданное значение, возведенное в куб. Но при использовании def, нам пришлось определить функцию с именем и defined_cube() дать ей входную величину. После выполнения нам также понадобилось возвратить результат, из того места, откуда была вызвана функция, и мы сделали это, используя ключевое слово return.
  • С применением лямбды: Определение лямбды не включает оператор return, а всегда содержит возвращенное выражение. Мы также можем поместить определение лямбды в любое место, где ожидается функция, и нам не нужно присваивать его переменной. Так выглядят простые лямбда-функции.
ЧИТАТЬ ТАКЖЕ:  Цикл for in range 1 6 print Python Rocks: сколько итераций и функция range

Сравнение с обычными функциями

Понятие функции - online presentation - изображение номер пятнадцать
Понятие функции — online presentation — изображение номер пятнадцать

Давайте сравним обычную функцию и лямбда-функцию, которые делают одно и то же:

>>> def square(x):… return x * x >>> square_lambda = lambda x: x * x >>> print(square(5)) >>> print(square_lambda(5)) >>> def power(base, exponent):… return base ** exponent >>> power_lambda = lambda base, exponent: base ** exponent >>> print(power(2, 3)) >>> print(power_lambda(2, 3))

Как видите, лямбда-функции более компактны, но менее читаемы для сложных операций.

Передача лямбда-функций в другие функции

>>> def apply_operation(x, y, operation):… «»»Применяет операцию к двум числам и возвращает результат»»»… return operation(x, y) >>> print(apply_operation(5, 3, lambda x, y: x + y)) >>> print(apply_operation(5, 3, lambda x, y: x * y)) >>> def format_data(data, formatter):… «»»Форматирует данные с помощью указанной функции»»»… return [formatter(item) for item in data] >>> names = [«alice», «bob», «charlie»] >>> print(format_data(names, lambda x: ()))

map() — применение функции к каждому элементу

Применение lambda, map и apply в - изображение номер семнадцать
Применение lambda, map и apply в — изображение номер семнадцать

map()
Функция применяет указанную функцию к каждому элементу итерируемого объекта:

>>> numbers = [1, 2, 3, 4, 5] >>> def double(x):… return x * 2 >>> doubled = list(map(double, numbers)) >>> print(doubled) >>> doubled_lambda = list(map(lambda x: x * 2, numbers)) >>> print(doubled_lambda) >>> celsius = [0, 10, 20, 30, 40] >>> fahrenheit = list(map(lambda c: (c * 9/5) + 32, celsius)) >>> print(fahrenheit)

filter() — отбор элементов по условию

#17 - изображение номер восемнадцать
#17 — изображение номер восемнадцать

>>> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> even_lambda = list(filter(lambda x: x % 2 == 0, numbers)) >>> print(even_lambda) >>> words = [«hi», «hello», «hey», «howdy», «hi there»] >>> long_words = list(filter(lambda word: len(word) > 3, words)) >>> print(long_words)

sorted() — сортировка с пользовательским ключом

How to - изображение номер девятнадцать
How to — изображение номер девятнадцать

sorted() key
Функция возвращает отсортированный список, а с помощью параметра можно указать функцию для извлечения значения для сравнения:

>>> numbers = [5, -3, 2, -8, 1, 0, -2] >>> sorted_numbers = sorted(numbers, key=lambda x: abs(x)) >>> print(sorted_numbers) >>> students = [… {«name»: «Alice», «grade»: 85},… {«name»: «Bob», «grade»: 92},… {«name»: «Charlie», «grade»: 78},… {«name»: «Diana», «grade»: 95}…] >>> sorted_by_grade = sorted(students, key=lambda student: student[«grade»], reverse=True) >>> for student in sorted_by_grade:… print(f»{student[‘name’]}: {student[‘grade’]}»)

reduce() — последовательное применение функции

A - изображение номер двадцать
A — изображение номер двадцать

reduce() functools
Функция (из модуля) последовательно применяет функцию к элементам, накапливая результат:

>>> from functools import reduce >>> numbers = [1, 2, 3, 4, 5] >>> total_lambda = reduce(lambda x, y: x + y, numbers) >>> print(total_lambda) >>> words = [«Hello», «world», «of», «Python»] >>> sentence = reduce(lambda x, y: x + » » + y, words) >>> print(sentence)

Лямбда-функции и функции высшего порядка

Встроенные функции - изображение номер двадцать один
Встроенные функции — изображение номер двадцать один

Мы используем лямбда-функцию, когда нам ненадолго требуется безымянная функция.

В Python мы часто используем их как аргумент функции высшего порядка (функции, которая принимает другие функции в качестве аргументов). Лямбда-функции используют вместе с такими встроенными функциями как filter(), map(),reduce() и др.

Давайте рассмотрим еще несколько распространенных вариантов использования лямбда-функций.

Когда использовать лямбда-функции?

  1. Функция простая (одно выражение)
  2. Функция используется только один раз (или несколько раз в одном месте)
  3. Функция передается как аргумент другой функции

map() filter() sorted()
Наиболее распространенные случаи использования — с функциями высшего порядка, такими как,, и др.

Ограничения лямбда-функций

  1. Только одно выражение — нельзя использовать несколько строк кода
  2. Отсутствие документации — нельзя добавить docstring
  3. Ограниченная читаемость — для сложных операций лучше обычные функции
  4. Нет оператора присваивания — в лямбде нельзя использовать =

>>> complex_lambda = lambda x: (… x ** 2 if x > 0… else x + 1 if x < 0… else 42…)… print(complex_lambda(5)) >>> def process_number(x):… «»»Обрабатывает число по правилам:… — Положительное -> квадрат… — Отрицательное -> x + 1… — Ноль -> 42… «»»… if x > 0:… return x ** 2… elif x < 0:… return x + 1… else:… return 42 >>> print(process_number(5)) 25

Часто задаваемые вопросы о лямбда-функциях в Python

Вопрос: Можно ли использовать лямбда-функцию как аргумент другой функции?
Ответ: Да, это основное применение лямбда-функций в Python, особенно с функциями высшего порядка.

Вопрос: В чем разница между лямбда и обычной функцией?
Ответ: Лямбда — это анонимная функция, которая может содержать только одно выражение, в то время как обычная функция может содержать множество инструкций.

Вопрос: Можно ли присвоить лямбда-функцию переменной?
Ответ: Да, но это считается плохой практикой, так как теряется смысл анонимности.

Вопрос: Как передать лямбду в функцию map()?
Ответ: Просто укажите лямбду первым аргументом, а итерируемый объект — вторым.

Вопрос: Может ли лямбда-функция содержать несколько аргументов?
Ответ: Да, лямбда может принимать любое количество аргументов, разделенных запятыми.

Вопрос: Поддерживает ли лямбда условные операторы?
Ответ: Да, можно использовать тернарный оператор (if else) внутри лямбды.

Вопрос: Можно ли использовать лямбду для сортировки списка словарей?
Ответ: Да, с помощью параметра key в функции sorted() или list.sort().

Вопрос: В чем ограничение лямбда-функций?
Ответ: Лямбда может содержать только одно выражение, нельзя использовать циклы, try/except или множественные инструкции.

Вопрос: Что такое функция высшего порядка?
Ответ: Это функция, которая принимает другую функцию в качестве аргумента или возвращает функцию.

Вопрос: Можно ли использовать лямбду с reduce()?
Ответ: Да, лямбда часто используется с reduce() для последовательного применения операции к элементам списка.