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

⚡ Умное резюме

Лямбда-функции в Python Это небольшие анонимные функции, определенные с помощью ключевого слова lambda вместо def. Они содержат одно выражение, принимают любое количество аргументов и часто передаются напрямую во встроенные функции, такие как map(), filter() и sorted().

  • 🔑 Ключевое слово Lambda: Лямбда-функция записывается в виде лямбда-аргументов: выражение, без директивы def, без имени и без явного указания возвращаемого значения.
  • 🧮 Единое выражение: Тело выражения содержит ровно одно выражение, значение которого возвращается автоматически, поэтому использование операторов и многострочных конструкций не допускается.
  • 🔗 Встроенное сопряжение: Лямбда-функции обычно передаются в функции map(), filter(), reduce() и sorted() для преобразования или выбора элементов в последовательности.
  • IIFE: Лямбда-функцию можно определить и вызвать немедленно, используя шаблон (lambda x: x + x)(2), возвращая результат сразу же.
  • Против поражения: Обычные функции нуждаются в имени и могут содержать множество операторов, в то время как лямбда-функции жертвуют этой возможностью ради компактного синтаксиса, занимающего всего одну строку.
  • 🤖 Помощь ИИ: Искусственный интеллект, например, GitHub Copilot, генерирует лямбда-выражения для ключей map, filter и sort на основе короткой подсказки.

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))

Code объяснение

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

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>

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

Code Объяснение:

1. Здесь мы определяем string то, что вы передадите в качестве параметра лямбда-функции.

2. Мы объявляем лямбда-функцию, которая вызывает оператор print и выводит результат.

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

Пример 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

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

Code Объяснение:

1. Вот та же строка, которую мы определили в предыдущем примере.

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

Пример 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

Code Объяснение:

1. Функция с именем guru, которая принимает другую функцию в качестве первого параметра, а затем любые последующие аргументы.

2. printer_one — это простая функция, которая выводит переданный ей параметр и возвращает его.

3. printer_two похож на printer_one, но без оператора return.

4. В этой части мы вызываем функцию guru, передавая в качестве параметров функции принтера и строку.

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

В следующем разделе вы узнаете, как использовать лямбда-функции с карта(), уменьшения () и фильтр() 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]

Code Объяснение:

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

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

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

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

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

Функция `map` используется для применения определённой операции к каждому элементу последовательности. Как и функция `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]

Code Объяснение:

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

2. Мы объявляем переменную с именем filtered_result, которая будет хранить сопоставленные значения.

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

4. Выведите результат, возвращенный функцией map.

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

Функция сокращения, такая как 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

Code Объяснение:

1. Импортируйте reduce из модуля functools.

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

3. Мы объявляем переменную с именем product, которая будет хранить уменьшенное значение.

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

5. Выведите результат, возвращенный функцией reduce.

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

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

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

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

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

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

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

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

Как уже говорилось, лямбда-функции — это просто функции, которые не имеют привязанного к ним идентификатора. Проще говоря, это функции без имен (следовательно, анонимные). Ниже приведена таблица, иллюстрирующая разницу между лямбда-функциями и обычными функциями. 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Однако любое другое имя функции даст тот же байт-код.

Часто задаваемые вопросы (FAQ)

Да. Лямбда-функция может использовать условное выражение, например, `lambda x: 'even' if x % 2 == 0 else 'odd'`. Она не может содержать полный оператор `if`, поскольку тело лямбда-функции должно представлять собой единое выражение, а не блок операторов.

В целом, нет. PEP 8 рекомендует использовать def, когда функции требуется имя, поскольку привязка лямбда-функции к переменной дает ей имя, но при этом теряется более понятный интерфейс. tracФункция `def` предоставляет обратную связь. Лямбда-выражения лучше всего передавать напрямую таким функциям, как `sorted()`, `map()` или `filter()`.

Нет. На уровне байт-кода. Python Она обрабатывает лямбда-функцию и эквивалентное ей определение одинаково, поэтому преимущества в скорости нет. Лямбда-функция экономит всего одну строку кода; она не выполняется быстрее, чем именованная функция, выполняющая идентичную работу.

Да. Лямбда-функция может считывать переменные из окружающей области видимости, образуя замыкание. Внутри цикла будьте осторожны: лямбда-функция захватывает саму переменную, а не её текущее значение, поэтому используйте аргумент по умолчанию, например, lambda x, n=n: x + n, чтобы зафиксировать её.

Передайте лямбда-функцию в качестве аргумента key в функции sorted() или list.sort(). Например, sorted(users, key=lambda u: u['age']) упорядочивает элементы по возрасту. Лямбда-функция указывает Python какое значение сравнивать для каждого элемента, что позволяет выполнить лаконичную пользовательскую сортировку без отдельной именованной функции.

Не напрямую, потому что у анонимной лямбда-функции нет имени, на которое можно было бы ссылаться. Можно обойти это, присвоив лямбда-функцию переменной и вызвав её по этому имени, но обычная функция `def` — более понятный и рекомендуемый вариант для рекурсии.

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

GitHub Copilot предлагает полные лямбда-выражения из короткого комментария или окружающего кода, включая правильные параметры и выражение для вызовов map(), filter() или sorted(). Он также может предложить преобразовать многословное лямбда-выражение в более понятную именованную функцию, когда важна читаемость.

Подведем итог этой публикации следующим образом: