Содержание
Краткая памятка по лямбда-функциям в Python
- Лямбда — это анонимная функция, создаваемая с помощью ключевого слова lambda.
- Синтаксис: lambda аргументы: выражение.
- Лямбда может принимать любое количество аргументов, но возвращает только одно выражение.
- Используйте лямбду для простых операций, чтобы не загромождать код.
- Лямбды идеально подходят для функций высшего порядка: map(), filter(), sorted(), reduce().
- Не присваивайте лямбду переменной — используйте def для именованных функций.
- Внутри лямбды можно использовать тернарный оператор (if else).
- Лямбда не поддерживает циклы, try/except и множественные инструкции.
- Для сложной логики всегда используйте обычные функции (def).
- Лямбды делают код более лаконичным, но могут снижать читаемость при злоупотреблении.
Что такое лямбда в 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 из примера выше, то это можно сделать вот так:
Но возникает вопрос: а зачем нужны лямбда-функции, если их можно объявлять традиционным образом? Но на самом деле, они полезны лишь в том случае, когда нужна одноразовая функция. Такие функции еще называют анонимными. И, как вы увидите дальше, есть масса ситуаций, где они оказываются нужны.
Лямбда-функция имеет следующий синтаксис.
Лямбда-функции могут иметь любое количество аргументов, но у каждой может быть только одно выражение. Выражение вычисляется и возвращается. Эти функции могут быть использованы везде, где требуется объект-функция.
Пример лямбда-функции.
Ниже представлен пример лямбда-функции, удваивающей вводимое значение.
В вышеуказанном коде lambda x: x*2 — это лямбда-функция. Здесь x — это аргумент, а x*2 — это выражение, которое вычисляется и возвращается.
Эта функция безымянная. Она возвращает функциональный объект с идентификатором double. Сейчас мы можем считать её обычной функцией.
- Эта функция может иметь любое количество аргументов, но вычисляет и возвращает только одно значение
- Лямбда-функции применимы везде, где требуются объекты-функции
- Вы должны помнить, что синтаксически лямбда-функция ограничена, позволяет представить всего одно выражение
- Они имеют множество вариантов применения в конкретных областях программирования, наряду с другими типами выражений, используемых в функциях.
Эта функция может иметь любое количество аргументов, но вычисляет и возвращает только одно значение
Вы должны помнить, что синтаксически лямбда-функция ограничена, позволяет представить всего одно выражение
Они имеют множество вариантов применения в конкретных областях программирования, наряду с другими типами выражений, используемых в функциях.
Примеры лямбда-функций
Теперь рассмотрим самые распространенные примеры использования лямбда-функций.
Лямбда с несколькими аргументами
А если их должно быть несколько, то достаточно лишь разделить значения запятыми. Предположим, что нужна функция, которая берет два числовых аргумента и возвращает их произведение.
Лямбда-функция без аргументов
Допустим, нужно создать функцию без аргументов, которая бы возвращала True. Этого можно добиться с помощью следующего кода.
Несколько лямбда-функций
В определенный момент возникнет вопрос: а можно ли иметь лямбда-функцию из нескольких строк.
Лямбда-функции в Python всегда принимают только одно выражение. Если же их несколько, то лучше создать обычную функцию.
Лямбда-функция и сортировка списков
Сортировка списка — базовая операция в Python. Если речь идет о списке чисел или строк, то процесс максимально простой. Подойдут встроенные функции sort и sorted.
Но иногда имеется список кастомных объектов, сортировать которые нужно на основе значений одного из полей. В таком случае можно передать параметр key в sort или sorted. Он и будет являться функцией.
Функция применяется ко всем элементам объекта, а возвращаемое значение — то, на основе чего выполнится сортировка. Рассмотрим пример. Есть класс Employee.
Предположим, что мы хотим отсортировать его на основе поля age сотрудников. Вот что нужно сделать для этого:
Лямбда-выражение было использовано в качестве параметра key вместо отдельного ее определения и затем передачи в функцию sort.
Лямбда и списковое включение
В этом примере мы будем использовать лямбда-функцию со списковым включением и лямбда-функцию с циклом for. Мы выведем на экран таблицу из 10 элементов.
Лямбда и условные операторы
Давайте рассмотрим использование условий if-else в лямбда-функции. Как вы знаете, Python позволяет нам использовать однострочные условия, и именно их мы можем помещать в лямбда-функцию для обработки возвращаемого результата.
Например, есть две цифры, и вы должны определить, какая из них представляет наибольшее число.
Лямбда и множественные операторы
Лямбда-функции не допускают использования нескольких операторов, однако мы можем создать две лямбда-функции, а затем вызвать вторую лямбда-функцию в качестве параметра для первой функции. Давайте попробуем найти второй по величине элемент, используя лямбду.
В предыдущем примере, мы создали лямбда-функцию, которая сортирует каждый вложенный список в заданном списке. Затем этот список проходит как параметр для второй лямбда-функции, которая возвращает элемент n-2 из отсортированного списка, где n — длина вложенного списка.
Пара слов о выражениях и инструкциях
Как уже упоминалось, лямбда могут иметь только одно выражение (expression) в теле.
Выражение и инструкции — две разные вещи, в которых часто путаются. В программировании инструкцией является строка кода, выполняющая что-то, но не генерирующая значение.
Например, инструкция if или циклы for и while являются примерами инструкций. Заменить инструкцию на значение попросту невозможно.
А вот выражения — это значения. Запросто можно заменить все выражения в программе на значения, и программа продолжит работать корректно.
- 3 + 5 — выражение со значением 8
- 10 > 5 — выражение со значением True
- True and (5 < 3) — выражение со значением False
Тело лямбда-функции должно являться выражением, поскольку его значение будет тем, что она вернет. Обязательно запомните это для работы с лямбда-функциями в будущем.
Различие между обычной функцией и лямбда-функцией
Рассмотрим пример и попробуем понять различие между определением (Def) для обычной функции и lambda-функции. Этот код возвращает заданное значение, возведенное в куб:
Как показано в примере выше, обе представленные функции, defined_cube() и lambda_cube(), ведут себя одинаково, как и предполагалось.
- Без использования лямбды: Здесь обе функции возвращают заданное значение, возведенное в куб. Но при использовании def, нам пришлось определить функцию с именем и defined_cube() дать ей входную величину. После выполнения нам также понадобилось возвратить результат, из того места, откуда была вызвана функция, и мы сделали это, используя ключевое слово return.
- С применением лямбды: Определение лямбды не включает оператор return, а всегда содержит возвращенное выражение. Мы также можем поместить определение лямбды в любое место, где ожидается функция, и нам не нужно присваивать его переменной. Так выглядят простые лямбда-функции.
Сравнение с обычными функциями
Давайте сравним обычную функцию и лямбда-функцию, которые делают одно и то же:
>>> 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() — применение функции к каждому элементу
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() — отбор элементов по условию
>>> 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() — сортировка с пользовательским ключом
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() — последовательное применение функции
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() и др.
Давайте рассмотрим еще несколько распространенных вариантов использования лямбда-функций.
Когда использовать лямбда-функции?
- Функция простая (одно выражение)
- Функция используется только один раз (или несколько раз в одном месте)
- Функция передается как аргумент другой функции
map() filter() sorted()
Наиболее распространенные случаи использования — с функциями высшего порядка, такими как,, и др.
Ограничения лямбда-функций
- Только одно выражение — нельзя использовать несколько строк кода
- Отсутствие документации — нельзя добавить docstring
- Ограниченная читаемость — для сложных операций лучше обычные функции
- Нет оператора присваивания — в лямбде нельзя использовать =
>>> 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() для последовательного применения операции к элементам списка.






















