DevGang
Авторизоваться

Как использовать лямбда-функции с map, filter и reduce

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

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

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

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

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

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

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

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

lambda arguments: expression

# to give it a name, assign it to a variable:
function_name = lambda arguments: expression

# this is equivalent to:
def function_name(arguments):
	return expression

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

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

Пример:

# Regular function to find the average of three numbers
def average(x, y, z):
    return (x + y + z) / 3

# Lambda function to find the average of three numbers
average = lambda x, y, z: (x + y + z) / 3

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

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

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

print(concat_and_uppercase("hello", "world"))  # Output: THE CONCATENATED STRING IS HELLOWORLD

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

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

1. Присвоение переменной

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

multiply = lambda x, y: print(f'{x} * {y} = {x * y}')
multiply(2, 10)  # Output: 2 * 10 = 20

#или 

multiply = lambda x, y: f'{x} * {y} = {x * y}'
print(multiply(2, 10))  # Output: 2 * 10 = 20

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

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

print((lambda x, y: f'{x} * {y} = {x * y}')(2, 10))  # Output: 2 * 10 = 20

#или

(lambda x, y: print(f'{x} * {y} = {x * y}'))(2, 10)  # Output: 2 * 10 = 20

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

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

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

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

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

# syntax

map(function, iterable)
  • function здесь принимает один аргумент и возвращает значение.
  • итерируемые элементы (например, listtuple) будут переданы в функцию.

Пример:

# List of pairs of numbers
pairs = [(2, 3), (4, 5), (6, 7)]

# Using lambda function with map to multiply each pair and print the result
list(map(lambda pair: print(f'{pair[0]} * {pair[1]} = {pair[0] * pair[1]}'), pairs))

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

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

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

Функция filter фильтрует элементы в итерации на основе указанного предиката. В новую итерацию включаются только элементы, для которых возвращается предикат True.

# syntax

filter(predicate, iterable)

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

Пример:

# List of ages
ages = [25, 30, 18, 42, 17, 50, 22, 19]

# Function to filter adults (age 18 and above) using filter with lambda
adults = filter(lambda age: age >= 18, ages)
print(list(adults))  # Output: [25, 30, 18, 42, 50, 22, 19]

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

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

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

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

# syntax

from functools import reduce
reduce(function, iterable)

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

Пример:

from functools import reduce

# List of numbers
numbers = [1, 2, 3, 4, 5]

# Using reduce with lambda to sum the numbers
sum_of_numbers = reduce(lambda x, y: x + y, numbers)
print(sum_of_numbers)  # Output: 15

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

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

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

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

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

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

print(sorted_cities)  # Output: ['America', 'Germany', 'India', 'Japan']

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

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

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

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

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

Пример:

# List of numbers
numbers = [1, 2, 3, 4, 5]

# Using lambda in list comprehension to square each number
squared_numbers = [(lambda x: x ** 2)(x) for x in numbers]
print(squared_numbers)  # Output: [1, 4, 9, 16, 25]

Заключение

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

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

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

Источник:

#Python
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу