Python Лямбда-функции с ПРИМЕРАМИ

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

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

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

  • Ключевое слово лямбда.
  • Параметры (или связанные переменные) и
  • Тело функции.

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

Синтаксис и примеры

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

lambda p1, p2: expression

Здесь p1 и p2 — параметры, которые передаются в лямбда-функцию. Вы можете добавить столько параметров, сколько вам нужно.

Однако обратите внимание, что мы не используем скобки для параметров, как в случае с обычными функциями. Последняя часть (выражение) — это любое допустимое выражение Python, которое работает с параметрами, которые вы предоставляете функции.

Пример 1

Теперь, когда вы знаете о лямбда-выражениях, давайте попробуем это на примере. Итак, откройте свой IDLE и введите следующее:

adder = lambda x, y: x + y
print (adder (1, 2))

Вот результат:

3

Код Пояснение

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

1. Ключевое слово лямбда, используемое для определения анонимной функции.

2. x и y — параметры, которые мы передаем лямбда-функции.

3. Это тело функции, которая добавляет два переданных нами параметра. Обратите внимание, что это одно выражение. Вы не можете написать несколько операторов в теле лямбда-функции.

4. Мы вызываем функцию и печатаем возвращаемое значение.

Пример 2

Это был базовый пример для понимания основ и синтаксиса лямбды. Давайте теперь попробуем распечатать лямбду и посмотрим результат. И снова откройте свой IDLE и введите следующее:

#What a lambda returns
string='some kind of a useless lambda'
print(lambda string : print(string))

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

Вывод:

<function <lambda> at 0x00000185C3BF81E0>

Что тут происходит? Давайте посмотрим на код, чтобы понять дальше.

Код Пояснение

  1. Здесь мы определяем string который вы передадите в качестве параметра в лямбду.
  2. Мы объявляем лямбду, которая вызывает оператор печати и печатает результат.

Но почему программа не печатает переданную нами строку? Это связано с тем, что сама лямбда возвращает объект функции. В этом примере лямбда не под названием с помощью функции печати, а просто возвращение объект функции и ячейка памяти, где он хранится. Это то, что печатается на консоли.

Пример 3

Однако, если вы напишете такую ​​программу:

#What a lambda returns #2
x="some kind of a useless lambda"
(lambda x : print(x))(x)

Запустите его, нажав F5, и вы увидите такой результат.

Вывод:

some kind of a useless lambda

Теперь вызывается лямбда, и передаваемая строка печатается на консоли. Но что это за странный синтаксис и почему определение лямбды заключено в скобки? Давайте поймем это сейчас.

Код Пояснение

  1. Вот та же строка, которую мы определили в предыдущем примере.
  2. В этой части мы определяем лямбду и немедленно вызываем ее, передавая строку в качестве аргумента. Это то, что называется IIFE, и вы узнаете больше об этом в следующих разделах этого руководства.

Пример 4

Давайте рассмотрим последний пример, чтобы понять, как выполняются лямбды и обычные функции. Итак, откройте свой IDLE и в новом файле введите следующее:

#A REGULAR FUNCTION
def guru( funct, *args ):
funct( *args )
def printer_one( arg ):
return print (arg)
def printer_two( arg ):
print(arg)
#CALL A REGULAR FUNCTION 
guru( printer_one, 'printer 1 REGULAR CALL' )
guru( printer_two, 'printer 2 REGULAR CALL \n' )
#CALL A REGULAR FUNCTION THRU A LAMBDA
guru(lambda: printer_one('printer 1 LAMBDA CALL'))
guru(lambda: printer_two('printer 2 LAMBDA CALL'))

Теперь сохраните файл и нажмите F5, чтобы запустить программу. Если вы не допустили никаких ошибок, результат должен быть примерно таким.

Вывод:

printer 1 REGULAR CALL

printer 2 REGULAR CALL

printer 1 LAMBDA CALL

printer 2 LAMBDA CALL

Код Пояснение

  1. Функция под названием guru, которая принимает другую функцию в качестве первого параметра и любые другие аргументы, следующие за ней.
  2. print_one — простая функция, которая печатает переданный ей параметр и возвращает его.
  3. print_two аналогичен print_one, но без оператора возврата.
  4. В этой части мы вызываем функцию гуру и передаем функции принтера и строку в качестве параметров.
  5. Это синтаксис для достижения четвертого шага (т. е. вызова функции гуру), но с использованием лямбда-выражений.

В следующем разделе вы узнаете, как использовать лямбда-функции с карта(), уменьшать(), и фильтр() in Python.

Использование лямбд с Python Модульное

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

IIFE в Python Лямбда

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

 (lambda x: x + x)(2)

Вот вывод и объяснение кода:

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

лямбды в фильтре()

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

Элементы, которые будут выбраны, основаны на некотором заранее определенном ограничении. Требуется 2 параметра:

  • Функция, определяющая ограничение фильтрации.
  • Последовательность (любой итератор, например списки, кортежи и т. д.)

Например,

sequences = [10,2,8,7,5,4,3,11,0, 1]
filtered_result = filter (lambda x: x > 4, sequences) 
print(list(filtered_result))

Вот вывод:

[10, 8, 7, 5, 11]

Пояснение к коду:

1. В первом утверждении мы определяем список, называемый последовательностями, который содержит некоторые числа.

2. Здесь мы объявляем переменную filtered_result, которая будет хранить отфильтрованные значения, возвращаемые функцией filter().

3. Лямбда-функция, которая выполняется для каждого элемента списка и возвращает true, если оно больше 4.

4. Распечатайте результат, возвращенный функцией фильтра.

лямбды в карте()

функция карты используется для применения определенной операции к каждому элементу последовательности. Как и filter(), он также принимает 2 параметра:

  1. Функция, определяющая операцию, выполняемую над элементами.
  2. Одна или несколько последовательностей

Например, вот программа, которая печатает квадраты чисел в заданном списке:

sequences = [10,2,8,7,5,4,3,11,0, 1]
filtered_result = map (lambda x: x*x, sequences) 
print(list(filtered_result))

Вывод:

 [100, 4, 64, 49, 25, 16, 9, 121, 0, 1]

[КР1]

Пояснение к коду:

  1. Здесь мы определяем список, называемый последовательностями, который содержит некоторые числа.
  2. Мы объявляем переменную filtered_result, которая будет хранить сопоставленные значения.
  3. Лямбда-функция, которая выполняется для каждого элемента списка и возвращает квадрат этого числа.
  4. Распечатайте результат, возвращенный функцией карты.

лямбды в функции сокращения()

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

Шаг 1) Выполните определенную операцию над первыми двумя элементами последовательности.

Шаг 2) Сохранить этот результат

Шаг 3) Выполните операцию с сохраненным результатом и следующим элементом последовательности.

Шаг 4) Повторяйте, пока не останется больше элементов.

Он также принимает два параметра:

  1. Функция, определяющая операцию, которую необходимо выполнить.
  2. Последовательность (любой итератор, например списки, кортежи и т. д.)

Например, вот программа, которая возвращает произведение всех элементов списка:

from functools import reduce
sequences = [1,2,3,4,5]
product = reduce (lambda x, y: x*y, sequences)
print(product)

Вот результат:

120

Пояснение к коду:

  1. Импортируйте сокращение из модуля functools.
  2. Здесь мы определяем список, называемый последовательностями, который содержит некоторые числа.
  3. Мы объявляем переменную Product, которая будет хранить уменьшенное значение.
  4. Лямбда-функция, выполняющаяся для каждого элемента списка. Он вернет произведение этого числа согласно предыдущему результату.
  5. Распечатайте результат, возвращаемый функцией сокращения.

Зачем (и почему бы и нет) использовать лямбда-функции?

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

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

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

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

Когда не следует использовать Lambda?

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

Лямбды против обычных функций

Как говорилось ранее, лямбды — это[vV4][J5] просто функции, к которым не привязан идентификатор. Проще говоря, это функции без имен (следовательно, анонимные). Вот таблица, иллюстрирующая разницу между лямбда-выражениями и обычными функциями в Python.

Лямбда

Обычные функции

Синтаксис:

lambda x : x + x

Синтаксис:

def (x) :
return x + x 

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

Обычные функции могут иметь в своем теле несколько выражений и операторов.

Лямбды не имеют связанного с ними имени. Вот почему их также называют анонимными функциями.

Обычные функции должны иметь имя и подпись.

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

Функции, которым необходимо возвращать значение, должны включать оператор return.

Объяснение различий?

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

Обычная функция для приведенного выше примера будет выглядеть так:

def adder (x, y):
return x + y 
print (adder (1, 2))

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

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

Как вы можете видеть на диаграмме, оба определения обрабатываются интерпретатором Python одинаково при преобразовании в байт-код. Теперь вы не можете назвать функцию лямбда потому что он зарезервирован Python, но любое другое имя функции даст тот же байт-код[KR6].

Итого

  • Лямбды, также известные как анонимные функции, представляют собой небольшие ограниченные функции, которым не требуется имя (т. е. идентификатор).
  • Каждая лямбда-функция в Python имеет 3 существенные части:
  • Ключевое слово лямбда.
  • Параметры (или связанные переменные) и
  • Тело функции.
  • Синтаксис записи лямбды: параметр лямбда: выражение.
  • Лямбды могут иметь любое количество параметров, но они не заключаются в фигурные скобки.
  • Лямбда-выражение может иметь только одно выражение в теле функции, которое возвращается по умолчанию.
  • На уровне байт-кода нет большой разницы между тем, как интерпретатор обрабатывает лямбды и обычные функции.
  • Лямбда-выражения поддерживают IIFE посредством следующего синтаксиса: (параметр лямбда: выражение)(аргумент)
  • Лямбды обычно используются со следующими встроенными модулями Python:
  • Фильтр: фильтр (лямбда-параметр: выражение, итерируемая последовательность)
  • Карта: карта (лямбда-параметр: выражение, итерируемые последовательности)
  • Уменьшить: уменьшить (лямбда-параметр1, параметр2: выражение, итерируемая последовательность)
  • Не пишите сложные лямбда-функции в производственной среде, потому что это будет сложно для сопровождающих код.

[J5]Я добавил таблицу, но для понимания различий необходимо объяснение.