Что такое лямбда-функция в Python?
Функция Lambda в Python программирования является анонимная функция или функция , не имеющая имени. Это небольшая и ограниченная функция, содержащая не более одной строки. Как и обычная функция, лямбда-функция может иметь несколько аргументов с одним выражением.
В Python лямбда-выражения (или лямбда-формы) используются для создания анонимных функций. Для этого вы будете использовать ключевое слово lambda (так же, как вы используете def для определения обычных функций). Каждая анонимная функция, которую вы определяете в Python, будет состоять из трех основных частей:
- Ключевое слово лямбда.
- Параметры (или связанные переменные) и
- Тело функции.
Лямбда-функция может иметь любое количество параметров, но тело функции может содержать только одно выражение. Более того, лямбда записывается в одну строку кода и может быть вызвана немедленно. Вы увидите все это в действии в следующих примерах.
В этом руководстве по Lambda в Python вы узнаете:
- Синтаксис и примеры
- Использование лямбда-выражений со встроенными модулями Python
- лямбды в filter ()
- лямбды в карте ()
- лямбды в reduce ()
- Почему (и почему нет) использовать лямбда-функции?
- Лямбды и обычные функции
Синтаксис и примеры
Формальный синтаксис для написания лямбда-функции приведен ниже:
lambda p1, p2: expression
Здесь p1 и p2 - это параметры, которые передаются лямбда-функции. Вы можете добавить столько параметров, сколько вам нужно.
Однако обратите внимание, что мы не используем скобки вокруг параметров, как это делается с обычными функциями. Последняя часть (выражение) - это любое допустимое выражение Python, которое работает с параметрами, которые вы предоставляете функции.
Пример 1
Теперь, когда вы знаете о лямбдах, давайте попробуем это на примере. Итак, откройте свой IDLE и введите следующее:
adder = lambda x, y: x + yprint (adder (1, 2))
Вот результат:
3
Код Пояснение
Здесь мы определяем переменную, которая будет содержать результат, возвращаемый лямбда-функцией.
1. Ключевое слово лямбда, используемое для определения анонимной функции.
2. x и y - параметры, которые мы передаем лямбда-функции.
3. Это тело функции, которая добавляет 2 переданных параметра. Обратите внимание, что это одно выражение. Вы не можете писать несколько операторов в теле лямбда-функции.
4. Вызываем функцию и печатаем возвращенное значение.
Пример 2
Это был базовый пример для понимания основ и синтаксиса лямбда. Давайте теперь попробуем распечатать лямбду и посмотреть результат. Снова откройте свой IDLE и введите следующее:
#What a lambda returnsstring='some kind of a useless lambda'print(lambda string : print(string))
Теперь сохраните файл и нажмите F5, чтобы запустить программу. Это результат, который вы должны получить.
Выход:
at 0x00000185C3BF81E0>
Что тут происходит? Давайте посмотрим на код, чтобы понять дальше.
Код Пояснение
- Здесь мы определяем строку, которую вы передадите в качестве параметра лямбда.
- Мы объявляем лямбду, которая вызывает оператор печати и выводит результат.
Но почему программа не печатает передаваемую строку? Это потому, что сама лямбда возвращает объект функции. В этом примере лямбда не называется функцией печати , но просто возвращая объект функции и место в памяти , где она хранится. Вот что печатается на консоли.
Пример 3
Однако, если вы напишете такую программу:
#What a lambda returns #2x="some kind of a useless lambda"(lambda x : print(x))(x)
И запустите его, нажав F5, вы увидите такой вывод.
Выход:
some kind of a useless lambda
Теперь вызывается лямбда, и передаваемая строка печатается на консоли. Но что это за странный синтаксис и почему определение лямбда заключено в скобки? Давайте теперь это поймем.
Код Пояснение
- Вот та же строка, которую мы определили в предыдущем примере.
- В этой части мы определяем лямбду и немедленно вызываем ее, передавая строку в качестве аргумента. Это то, что называется IIFE, и вы узнаете о нем больше в следующих разделах этого руководства.
Пример 4
Давайте посмотрим на последний пример, чтобы понять, как выполняются лямбды и обычные функции. Итак, откройте свой IDLE и в новом файле введите следующее:
#A REGULAR FUNCTIONdef guru( funct, *args ):funct( *args )def printer_one( arg ):return print (arg)def printer_two( arg ):print(arg)#CALL A REGULAR FUNCTIONguru( printer_one, 'printer 1 REGULAR CALL' )guru( printer_two, 'printer 2 REGULAR CALL \n' )#CALL A REGULAR FUNCTION THRU A LAMBDAguru(lambda: printer_one('printer 1 LAMBDA CALL'))guru(lambda: printer_two('printer 2 LAMBDA CALL'))
Теперь сохраните файл и нажмите F5, чтобы запустить программу. Если вы не допустили ошибок, результат должен быть примерно таким.
Выход:
принтер 1 ОБЫЧНЫЙ ЗВОНОК
принтер 2 ОБЫЧНЫЙ ЗВОНОК
принтер 1 ЛЯМБДА ЗВОНОК
принтер 2 LAMBDA CALL
Код Пояснение
- Функция, называемая гуру, которая принимает другую функцию в качестве первого параметра и любые другие аргументы, следующие за ней.
- printer_one - это простая функция, которая печатает переданный ей параметр и возвращает его.
- printer_two похож на printer_one, но без оператора return.
- В этой части мы вызываем функцию гуру и передаем функции принтера и строку в качестве параметров.
- Это синтаксис для достижения четвертого шага (т.е. вызова функции гуру), но с использованием лямбда-выражений.
В следующем разделе вы узнаете, как использовать лямбда-функции с map (), reduce () и filter () в Python.
Использование лямбда-выражений со встроенными модулями Python
Лямбда-функции предоставляют элегантный и мощный способ выполнения операций с использованием встроенных в Python методов. Это возможно, потому что лямбда-выражения могут быть вызваны немедленно и переданы в качестве аргумента этим функциям.
IIFE в Python Lambda
IIFE означает выполнение немедленно вызываемой функции. Это означает, что лямбда-функция вызывается сразу после ее определения. Давайте разберемся с этим на примере; запустите свой IDLE и введите следующее:
(lambda x: x + x)(2)
Вот вывод и объяснение кода:
Эта возможность немедленного вызова лямбда-выражений позволяет вам использовать их внутри таких функций, как map () и reduce (). Это полезно, потому что вы, возможно, не захотите снова использовать эти функции.
лямбды в filter ()
Функция фильтра используется для выбора определенных элементов из последовательности элементов. Последовательность может быть любым итератором, например списками, наборами, кортежами и т. Д.
Элементы, которые будут выбраны, основаны на некотором заранее определенном ограничении. Принимает 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. Здесь мы объявляем переменную с именем filter_result, в которой будут храниться отфильтрованные значения, возвращаемые функцией filter ().
3. Лямбда-функция, которая выполняется для каждого элемента списка и возвращает истину, если он больше 4.
4. Распечатайте результат, возвращенный функцией фильтра.
лямбды в карте ()
функция карты используется для применения определенной операции к каждому элементу в последовательности. Как и filter (), он также принимает 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, 121, 0, 1]
[KR1]
Пояснение к коду:
- Здесь мы определяем список, называемый последовательностями, который содержит некоторые числа.
- Мы объявляем переменную с именем filter_result, в которой будут храниться сопоставленные значения.
- Лямбда-функция, которая запускается для каждого элемента списка и возвращает квадрат этого числа.
- Распечатайте результат, возвращенный функцией карты.
лямбды в reduce ()
Функция сокращения, такая как map (), используется для применения операции к каждому элементу в последовательности. Однако по работе он отличается от карты. Это шаги, за которыми следует функция reduce () для вычисления вывода:
Шаг 1) Выполните указанную операцию над первыми двумя элементами последовательности.
Шаг 2) Сохраните этот результат
Шаг 3) Выполните операцию с сохраненным результатом и следующим элементом в последовательности.
Шаг 4) Повторяйте, пока не останутся все элементы.
Также он принимает два параметра:
- Функция, определяющая выполняемую операцию
- Последовательность (любой итератор, например списки, кортежи и т. Д.)
Например, вот программа, которая возвращает произведение всех элементов в списке:
from functools import reducesequences = [1,2,3,4,5]product = reduce (lambda x, y: x*y, sequences)print(product)
Вот результат:
120
Пояснение к коду:
- Импортировать сокращение из модуля functools
- Здесь мы определяем список, называемый последовательностями, который содержит некоторые числа.
- Мы объявляем переменную с именем product, в которой будет храниться уменьшенное значение.
- Лямбда-функция, которая выполняется для каждого элемента списка. Он вернет произведение этого числа в соответствии с предыдущим результатом.
- Выведите результат, возвращаемый функцией уменьшения.
Почему (и почему нет) использовать лямбда-функции?
Как вы увидите в следующем разделе, лямбды обрабатываются так же, как обычные функции на уровне интерпретатора. В некотором смысле можно сказать, что лямбда-выражения обеспечивают компактный синтаксис для написания функций, возвращающих одно выражение.
Однако вы должны знать, когда лучше использовать лямбды, а когда их следует избегать. В этом разделе вы узнаете некоторые принципы проектирования, используемые разработчиками Python при написании лямбда-выражений.
Один из наиболее распространенных вариантов использования лямбда-выражений - функциональное программирование, поскольку Python поддерживает парадигму (или стиль) программирования, известную как функциональное программирование.
Он позволяет вам предоставить функцию в качестве параметра другой функции (например, в карте, фильтре и т. Д.). В таких случаях использование лямбда-выражений предлагает элегантный способ создать одноразовую функцию и передать ее в качестве параметра.
Когда не следует использовать Lambda?
Никогда не следует писать сложные лямбда-функции в производственной среде. Кодерам, обслуживающим ваш код, будет очень сложно его расшифровать. Если вы обнаружите, что делаете сложные однострочные выражения, было бы гораздо лучше определить правильную функцию. Лучше всего помнить, что простой код всегда лучше, чем сложный.
Лямбды и обычные функции
Как было сказано ранее, лямбды - это [vV4] [J5] просто функции, не имеющие привязанного к ним идентификатора. Проще говоря, это функции без имен (следовательно, анонимные). Вот таблица, иллюстрирующая разницу между лямбдами и обычными функциями в Python.
Лямбды
Обычные функции
Синтаксис:
lambda x : x + x
Синтаксис:
def (x) :return x + x
Лямбда-функции могут иметь только одно выражение в своем теле.
Обычные функции могут иметь в своем теле несколько выражений и операторов.
Лямбды не имеют имени. Вот почему они также известны как анонимные функции.
Обычные функции должны иметь имя и подпись.
Лямбда-выражения не содержат оператора возврата, потому что тело возвращается автоматически.
Функции, которым необходимо возвращать значение, должны включать оператор возврата.
Объяснение отличий?
Основное различие между лямбда-функцией и обычной функцией заключается в том, что лямбда-функция оценивает только одно выражение и возвращает объект функции. Следовательно, мы можем назвать результат лямбда-функции и использовать его в нашей программе, как мы это делали в предыдущем примере.
Обычная функция для приведенного выше примера будет выглядеть так:
def adder (x, y):return x + yprint (adder (1, 2))
Здесь мы должны определить имя функции, которая возвращает результат, когда мы ее вызываем . Лямбда-функция не содержит оператора возврата, потому что у нее будет только одно выражение, которое всегда возвращается по умолчанию. Вам даже не нужно назначать лямбду, так как ее можно сразу вызвать (см. Следующий раздел). Как вы увидите в следующем примере, лямбды становятся особенно мощными, когда мы используем их со встроенными функциями Python.
Однако вам все еще может быть интересно, чем лямбда-выражения отличаются от функции, возвращающей одно выражение (например, приведенное выше). На уровне переводчика особой разницы нет. Это может показаться удивительным, но любая лямбда-функция, которую вы определяете в Python, рассматривается интерпретатором как обычная функция.
Как вы можете видеть на диаграмме, два определения обрабатываются интерпретатором Python одинаково при преобразовании в байт-код. Теперь вы не можете назвать функцию лямбда, потому что она зарезервирована Python, но любое другое имя функции даст тот же байт-код [KR6].
Резюме
- Лямбда-выражения, также известные как анонимные функции, представляют собой небольшие ограниченные функции, которым не требуется имя (т. Е. Идентификатор).
- Каждая лямбда-функция в Python состоит из трех основных частей:
- Ключевое слово лямбда.
- Параметры (или связанные переменные) и
- Тело функции.
- Синтаксис для записи лямбда: параметр лямбда: выражение
- У лямбда-выражений может быть любое количество параметров, но они не заключаются в фигурные скобки.
- Лямбда может иметь только одно выражение в теле функции, которое возвращается по умолчанию.
- На уровне байт-кода нет большой разницы между тем, как лямбда-выражения и обычные функции обрабатываются интерпретатором.
- Лямбда-выражения поддерживают IIFE с помощью этого синтаксиса: (параметр лямбда: выражение) (аргумент)
- Лямбды обычно используются со следующими встроенными модулями Python:
- Фильтр: фильтр (лямбда-параметр: выражение, итеративная последовательность)
- Карта: карта (лямбда-параметр: выражение, повторяющиеся последовательности)
- Reduce: reduce (лямбда-параметр1, параметр2: выражение, итеративная последовательность)
- Не пишите сложные лямбда-функции в производственной среде, потому что это будет сложно для разработчиков кода.
[J5] Я добавил таблицу, но для понимания различий необходимо пояснение.