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

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

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

Содержание

Что собой представляют лямбда-функции в Python?

В Python лямбда-функция — это небольшая анонимная функция, определенная с помощью ключевого слова lambda.

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

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

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

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

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

lambda arguments: expression

# Чтобы дать лямбда-функции имя,
# назначьте ее в качестве значения переменной:
function_name = lambda arguments: expression

# Это эквивалентно следующему:
def function_name(arguments):
	return expression

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

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

Пример:

# Обычная функция для вычисления среднего арифметического трех чисел
def average(x, y, z):
    return (x + y + z) / 3

# Лямбда-функция для вычисления среднего арифметического трех чисел
average = lambda x, y, z: (x + y + z) / 3

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

Например, вот лямбда-функция для объединения двух строк и перевода их в верхний регистр:

concat_and_uppercase = lambda str1, str2: (f'The concatenated string is {str1 + str2}'.upper())

print(concat_and_uppercase("hello", "world"))  
# Результат: THE CONCATENATED STRING IS HELLOWORLD

Способы вызова лямбда-функций

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

  1. Присвоение функции переменной
  2. Прямой вызов функции
  3. Использование функции в качестве аргумента для функций высшего порядка

1. Присвоение лямбда-функции переменной

Задайте лямбда-функцию в качестве значения переменной, а затем вызовите ее с помощью этой переменной:

multiply = lambda x, y: print(f'{x} * {y} = {x * y}')
multiply(2, 10)  
# Результат: 2 * 10 = 20

или 

multiply = lambda x, y: f'{x} * {y} = {x * y}'
print(multiply(2, 10))  
# Результат: 2 * 10 = 20

2. Прямой вызов лямбда-функции

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

print((lambda x, y: f'{x} * {y} = {x * y}')(2, 10))  
# Результат: 2 * 10 = 20

или

(lambda x, y: print(f'{x} * {y} = {x * y}'))(2, 10)  
# Результат: 2 * 10 = 20

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

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

Использование лямбда-функций с map()

Функция map применяет переданную ей функцию к каждому элементу итерируемого объекта (например, списка) и возвращает новый итерируемый объект с обновленными элементами.

# Синтаксис

map(function, iterable)

Здесь function — это функция, которая принимает один аргумент и возвращает значение. В function будут передаваться элементы iterable (итерируемого объекта, например, списка или кортежа).

Пример:

# Список из пар чисел
pairs = [(2, 3), (4, 5), (6, 7)]

# Использование лямбда-функции
# для перемножения каждой пары и вывода результата
list(map(lambda pair: print(f'{pair[0]} * {pair[1]} = {pair[0] * pair[1]}'), pairs))

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

Функция map применяет эту лямбда-функцию к каждой паре (кортежу) в списке. Обертывание вызова map в list гарантирует, что лямбда-функция будет выполнена для каждой пары. В итоге код выводит результаты умножения для каждой пары в списке, показывая в выводе «2 * 3 = 6», «4 * 5 = 20» и «6 * 7 = 42».

Использование лямбда-функций с filter()

Функция filter фильтрует элементы итерируемого объекта на основе заданного предиката. Предикат — это функция, которая принимает один аргумент и возвращает булево значение (True или False). Только те элементы, для которых предикат возвращает True, включаются в новый итерируемый объект.

# Синтаксис

filter(predicate, iterable)

Здесь элементы iterable (итерируемого объекта) будут проверяться с помощью predicate (предиката).

Пример:

# Список возрастов
ages = [25, 30, 18, 42, 17, 50, 22, 19]

# Функция для отфильтровывания взрослых
# (имеющих возраст 18 и больше лет),
# использующая filter с лябмдой
adults = filter(lambda age: age >= 18, ages)
print(list(adults))  
# Результат: [25, 30, 18, 42, 50, 22, 19]

Пояснение. В этом коде мы начинаем со списка возрастов ages. Мы используем лямбда-функцию для определения простого условия, которое проверяет, является ли значение age большим или равным 18.

Функция filter применяет эту лямбда-функцию к каждому значению в списке, отфильтровывая все значения меньше 18. Преобразовав результат работы filter в список, мы получаем список значений от 18 и больше. Наконец, мы печатаем этот отфильтрованный список, в результате чего на экран выводятся возраста [25, 30, 18, 42, 50, 22, 19], поскольку именно они соответствуют критерию >= 18.

Использование лямбда-функций с reduce()

Функция reduce применяет заданную функцию к элементам итерируемого объекта, чтобы свести их к одному значению. Она является частью модуля functools.

# Синтаксис

from functools import reduce
reduce(function, iterable)

Здесь function принимает два аргумента и возвращает одно значение. Этой функцией будут обработаны элементы iterable.

Пример:

from functools import reduce

# Список чисел
numbers = [1, 2, 3, 4, 5]

# Использование reduce с лямбда-функцией для суммирования чисел
sum_of_numbers = reduce(lambda x, y: x + y, numbers)
print(sum_of_numbers)  # Результат: 15

Пояснение. В этом коде мы начинаем со списка чисел numbers. Мы используем функцию reduce из модуля functools, чтобы вычислить сумму всех чисел в списке. Лямбда-функция используется для простой операции сложения: она принимает два аргумента, x и y, и возвращает их сумму. Функция reduce применяет эту лямбда-функцию кумулятивно к элементам списка, начиная с первой пары и далее по всему списку:

  1. Изначально x — первый элемент списка (1), а y — второй (2), в результате их сложения получается 3.
  2. Затем полученная сумма (3) становится x, а следующий элемент списка (3) становится y, в результате их сложения получается 6.
  3. Этот процесс продолжается до тех пор, пока все элементы списка не будут просуммированы. В итоге получается 15 — сумма всех чисел в списке [1, 2, 3, 4, 5].

Дополнительные примеры использования

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

Сортировка списка строк

cities = ["India", "Germany", "America", "Japan"]
sorted_cities = sorted(cities, key=lambda city: city.lower())

print(sorted_cities)  
# Результат: ['America', 'Germany', 'India', 'Japan']

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

Мы используем функцию sorted для сортировки названий городов в алфавитном порядке, игнорируя регистр. Параметр key в функции sorted позволяет нам указать функцию (в данном случае лямбда-функцию) для настройки порядка сортировки.

Лямбда-функция lambda city: city.lower() переводит название каждого города в нижний регистр перед сортировкой. Это гарантирует регистронезависимость сортировки: названия городов, записанные с заглавными буквами и без них, будут обрабатываться одинаково.

После сортировки отсортированный список присваивается переменной sorted_cities, и мы выводим результат. На выходе мы видим отсортированный список городов: [‘America’, ‘Germany’, ‘India’, ‘Japan’], где города расположены в алфавитном порядке без учета регистра букв.

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

Лямбда-функции могут быть использованы в list comprehensions (представлениях списков) для применения функции к каждому элементу списка.

Пример:

# Список чисел
numbers = [1, 2, 3, 4, 5]

# Использование лямбды в list comprehension
# для возведения каждого числа в квадрат
squared_numbers = [(lambda x: x ** 2)(x) for x in numbers]
print(squared_numbers)  
# Результат: [1, 4, 9, 16, 25]

Заключение

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

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

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

Перевод статьи «Lambda Functions in Python – How to Use Lambdas with Map, Filter, and Reduce».

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх