Lambda python что это
Перейти к содержимому

Lambda python что это

  • автор:

Lambda python что это

Лямбда-выражения в языке Python представляют небольшие анонимные функции, которые определяются с помощью оператора lambda . Формальное определение лямбда-выражения:

lambda [параметры] : инструкция

Определим простейшее лямбда-выражение:

message = lambda: print("hello") message() # hello

Здесь лямбда-выражение присваивается переменной message. Это лямбда-выражение не имеет параметров, ничего не возвращает и просто выводит строку «hello» на консоль. И через переменную message мы можем вызвать это лямбда-выражение как обычную функцию. Фактически оно аналогично следующей функции:

def message(): print("hello")

Если лямбда-выражение имеет параметры, то они определяются после ключевого слова lambda . Если лямбда-выражение возвращает какой-то результат, то он указывается после двоеточия. Например, определим лямбда-выражение, которое возвращает квадрат числа:

square = lambda n: n * n print(square(4)) # 16 print(square(5)) # 25

В данном случае лямбда-выражение принимает один параметр — n. Справа от двоеточия идет возвращаемое значение — n* n . Это лямбда-выражение аналогично следующей функции:

def square2(n): return n * n

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

sum = lambda a, b: a + b print(sum(4, 5)) # 9 print(sum(5, 6)) # 11

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

def do_operation(a, b, operation): result = operation(a, b) print(f"result = ") do_operation(5, 4, lambda a, b: a + b) # result = 9 do_operation(5, 4, lambda a, b: a * b) # result = 20

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

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

def select_operation(choice): if choice == 1: return lambda a, b: a + b elif choice == 2: return lambda a, b: a - b else: return lambda a, b: a * b operation = select_operation(1) # operation = sum print(operation(10, 6)) # 16 operation = select_operation(2) # operation = subtract print(operation(10, 6)) # 4 operation = select_operation(3) # operation = multiply print(operation(10, 6)) # 60

Анонимные функции — Python: Функции

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

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

Принцип работы именованных функций

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

Пример именованной функции:

def add_numbers(x, y): return x + y 

Здесь именованная функция — add_numbers . Она принимает два аргумента x и y и возвращает их сумму.

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

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

Принцип работы анонимных функций

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

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

В Python определение подобной функции выглядит так:

lambda x: x + 1 # at 0x7f56e5798a60> 

Мы сконструировали функцию, но имя она не получила, поэтому REPL ее отобразил как function .

Рассмотрим пример, который использует анонимную функцию:

l = [1, 2, 5, 3, 4] l.sort(key=lambda x: -x) l # [5, 4, 3, 2, 1] 

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

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

Рассмотрим другой пример, который использует анонимную функцию вместе с функцией map() :

l = [1, 2, 3, 4, 5] result = list(map(lambda x: x * 2, l)) result # [2, 4, 6, 8, 10] 

В данном примере функция map() принимает анонимную функцию и список данных. Анонимная функция lambda x: x * 2 принимает один аргумент x и умножает его на два. Функция map() применяет эту анонимную функцию к каждому элементу списка l и возвращает новый список, в котором каждый элемент удвоен. Результат сохраняется в переменной result и выводится на экран.

Теперь рассмотрим пример работы с функцией filter :

l = [1, 2, 3, 4, 5] result = list(filter(lambda x: x % 2 == 0, l)) result # [2, 4] 

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

Здесь лямбда-функция lambda x: x % 2 == 0 определяет, что элемент должен быть четным — его остаток при делении на два должен быть равен нулю.

Функция filter применяет лямбда-функцию к каждому элементу списка l и оставляет только те элементы, для которых лямбда-функция возвращает True . Затем эти элементы используются для создания нового списка с помощью функции list .

Посмотрим на еще один пример применения анонимной функции, но уже с функцией reduce :

from functools import reduce l = [1, 2, 3, 4, 5] result = reduce(lambda x, y: x * y, l) result # 120 

В данном примере используется лямбда-функция, которая принимает два аргумента: x и y . В итоге она возвращает их произведение. Итерируемый объект l содержит числа [1, 2, 3, 4, 5] . Поэтому функция reduce последовательно умножает каждую пару чисел в списке: (1 * 2) * 3) * 4) * 5 . Это приводит к результату 120 .

Особенности анонимных функций

Рассмотрим главные особенности анонимных функций:

  • Аргументы анонимных функций не заключены в скобки. К этому нужно будет привыкнуть. Остальные средства для описания аргументов доступны в полной мере — и именованные аргументы, и *args с **kwargs
  • Тело лямбда-функции — это всегда одно выражение, результат вычисления которого и будет возвращаемым значением. В теле лямбда-функции не получится выполнить несколько действий и не получится использовать многострочные конструкции вроде for и while . Но зато анонимные функции обычно просто читать, чего было бы сложно добиться, разреши авторам «многострочные» лямбды
  • Объявление функции является выражением. Функции можно конструировать и тут же вызывать, не заканчивая выражение:
1 + (lambda x: x * 5)(8) + 1 # 42 

В таком виде лямбды встречаются редко. Зато часто можно встретить возврат лямбды из функции:

def caller(arg): return lambda f: f(arg) call_with_five = caller(5) call_with_five(str) # '5' call_with_five(lambda x: x + 1) # 6 

Из этого примера можно понять, что лямбды являются замыканиями — возвращаемая лямбда запоминает значение переменной arg .

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов

Наши выпускники работают в компаниях:

Lambda python что это

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

Пример 2.21. lambda-функции

>>> def f(x): . return x*2 . >>> f(3) 6 >>> g = lambda x: x*2  >>> g(3) 6 >>> (lambda x: x*2)(3)  6
Эта lambda-функция делает то же самое, что и обычная функция, определенная выше. Обратите внимание на сокращенный синтаксис: список аргументов записывается без скобок и ключевое слово return отсутствует (оно подразумевается, так как тело функции может содержать только одно выражение). Кроме того, функция не имеет имени, но может быть вызвана через переменную, которой она присвоена.
Вы можете использовать lambda-функцию даже не присваивая ее переменной. Это не самый полезный пример, но он показывает, что lambda-функция может быть определена прямо в месте ее использования.

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

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

Пример 2.22. lambda-функции в apihelper.py

processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)

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

Пример 2.23. split без аргументов

>>> s = "this is\na\ttest"  >>> print s this is a test >>> print s.split()  ['this', 'is', 'a', 'test'] >>> print " ".join(s.split())  'this is a test'
Это строка, которая содержит символ переход на новую строку, записанный в виде специальной последовательности (такие строки могут быть также записаны с использованием утроенных кавычек). \n — переход на новую строку, \t — символ горизонтальной табуляции.
Метод split без аргументов разбивает строку по символам пропуска. В данном случае три пробела, переход на новую строку и табуляция воспринимаются одинаково.
Вы можете нормализовать пропуски разбив строку, а затем снова объединив ее, используя один пробул в качестве разделителя. Именно это делает функция help для того, чтобы свернуть строку документации.

Так что же на самом деле делает функция help с этими lambda-функциями, методами split и приемом с and-or?

Пример 2.24. Присваивание функции переменной

processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)

processFunc теперь ссылается на функцию, но на какую — это зависит от значения переменной collapse. Если collapse является истиной, processFunc(string) будет сворачивать символы пропуска, в противном случае processFunc(string) будет возвращать аргумент без изменений. Для того, чтобы сделать это на менее мощном языке, например на Visual Basic, вы, скорее всего, будете использовать интсрукцию if, чтобы решить, сворачивать символы пропуска или нет. Такой подход неэффективен, так как проверять условие придется при каждом вызове функции. В языке Python вы можете принять решение один раз и определить lambda-функцию, которая будет делать только то, что вам нужно.

  • Python Knowledge Base описывает использование lambda для косвенного вызова функций.
  • Python Tutorial показывает, как получить доступ к внешним переменным из lambda-функции (PEP 227 поясняет, что в будущих версиях Python это будет сделать проще).
  • В The Whole Python FAQ приводятся примеры сбивающих с толку однострочных lambda-функций.

Copyright © 2000, 2001, 2002 Марк Пилгрим

Copyright © 2001, 2002 Перевод, Денис Откидач

Лямбда-функции в Python: примеры

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

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

В Python мы обычно создаём функции так:

def my_func(a): # Тело функции

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

Например, функция, удваивающая аргумент:

def double(x): return x*2

Такую функцию, например, можно использовать в методе map .

def double(x): return x*2 my_list = [1, 2, 3, 4, 5, 6] new_list = list(map(double, my_list)) print(new_list) # [2, 4, 6, 8, 10, 12]

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

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

Как вы уже поняли, лямбды применяются там, где нужна маленькая функция на короткое время – например, в функциях высшего порядка, таких как map или filter .

Синтаксис лямбда-функции имеют следующий:

lambda args: expression

Сперва пишется слово lambda , затем идет одинарный пробел, за ним — список аргументов через запятую, следом – двоеточие и само выражение, являющееся телом функции.

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

Аргументов в них может быть сколько угодно, но выражение в теле обязательно одно.

Пример 1

Можно написать лямбду, которая удваивает свой аргумент: lambda x: x*2 , и использовать её в функции map , чтобы удвоить все элементы в списке:

my_list = [1, 2, 3, 4, 5, 6] new_list = list(map(lambda x: x*2, my_list)) print(new_list) # [2, 4, 6, 8, 10, 12]

Заметьте разницу между этим кодом и функцией double , которую мы написали выше: лямбда гораздо компактнее.

Пример 2

А ещё можно создать лямбда-функцию, которая ищет числа больше нуля: lambda x: x > 0 и использовать в filter , чтобы создать список исключительно положительных чисел.

my_list = [18, -3, 5, 0, -1, 12] new_list = list(filter(lambda x: x > 0, my_list)) print(new_list) # [18, 5, 12]

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

Пример 3

Лямбда также может быть возвращаемым значением другой функции.

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

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

def muliplyBy (n): return lambda x: x*n double = multiplyBy(2) triple = muliplyBy(3) times10 = multiplyBy(10)

Лямбда-функция принимает значение n из функции multiplyBy . Таким образом, в double параметр n равен 2 , в triple — 3 , а в times10 – 10 . Теперь при вызове полученных функций с определённым аргументом будет производиться умножение на соответствующее число.

double(6) > 12 triple(5) > 15 times10(12) > 120

Без лямбды вам бы пришлось определять внутри multiplyBy другие функции:

def muliplyBy (x): def temp (n): return x*n return temp

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

Заключение

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

Добавить комментарий

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