Python. Лямбда-выражения. Анонимные функции. Ключевое слово lambda




Лямбда-выражения. Анонимные функции. Ключевое слово lambda. Таблица переходов


Содержание


Поиск на других ресурсах:

1. Анонимные функции. Понятия. Ключевое слово lambda. Общая форма

Язык Python позволяет задавать объекты функции в виде выражений. В этом случае ключевое слово def заменяется ключевым словом lambda.

Различие между использованием def и lambda заключается в том, что в случае с def выражение связывает имя с функцией, а в случае использования lambda выражение возвращает функцию.

Общая форма объявления lambda-выражения следующая:

lambda agrument1, agrument2, ..., argumentN: expression

здесь

  • argument1, argument2, argumentN — имена аргументов, которые использует lambda-выражение;
  • expression — непосредственно лямбда-выражение.

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

  • лямбда-выражения записываются в одной строке. Если попытаться поместить выражение expression в другую строку, то компилятор выдаст ошибку;
  • лямбда-выражения создают функции, которые не имеют имени. Такие функции называются анонимными функциями.

 

2. Случаи использования лямбда-выражений

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

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

 

3. Отличия между объявлением и использованием лямбда-выражений (lambda) и функций (def)

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

  • лямбда-выражение объявляется с помощью ключевого слова lambda. Функция объявляется с помощью ключевого слова def;
  • лямбда-выражения — это выражения, def — это инструкции. Это означает, что лямбда-выражение может быть использовано там, где не допускается использование def: внутри литералов или вызовах функций;
  • лямбда-выражение содержит только одно выражение, которое возвращается. Результат вычисления выражения является результатом лямбда-выражения. Для возвращения результата из лямбда-выражения не нужно использовать инструкцию return;
  • в отличие от объявления функций (def) лямбда-выражения предназначены для вычисления более простых фрагментов кода по сравнению с функциями;
  • программный код лямбда-выражения формируется в виде одной строки. Программный код функции может содержать большое количество строк.

 

4. Преимущества использования лямбда-выражений

Использование лямбда-выражений дает следующие преимущества:

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

 

5. Примеры, демонстрирующие самые простые лямбда-выражения. Различия между инструкциями def и lambda. Вызов лямбда-выражений как имен

В нижеследующих примерах продемонстрировано:

  • объявление лямбда-выражения и его присвоение некоторому имени;
  • вызов (использование) лямбда-выражения по имени;
  • различия между объявлением и использованием функций (def) и лямбда-выражений (lambda).

Пример 1. Вычисление произведения трех чисел.

# Лямбда-выражения и функции

# Вычисление произведения чисел.
# Лямбда-выражение, которое возвращает произведение трех чисел
multL = lambda a, b, c: a * b * c # лямбда-выражение в одной строке
resLambda = multL(2,5,5)         # вызов лямбда-выражения

# Функция, возвращающая произведение трех чисел
def multF(a, b, c):
    return a*b*c

resFunc = multF(2,5,5) # вызов функции

# Вывод результата
print("resLambda = ", resLambda)
print("resFunc = ", resFunc)

Результат выполнения программы

resLambda = 50
resFunc = 50

В вышеприведенном примере результат лямбда-выражения присваивается имени multL

multL = lambda a, b, c: a * b * c

Затем вызов лямбда-выражения с конкретными значениями (a = 2, b = 5, c = 5) присваивается имя (объекта) resLambda

resLambda = multL(2,5,5) # вызов лямбда-выражения

В результате, в объекте resLambda содержится произведение чисел 2*5*5 = 50.

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

# Лямбда-выражения и функции
import math

# 1. Лямбда-выражение, которое определяет модуль комплексного числа
absL = lambda a, b: math.sqrt(a*a + b*b) # объявление
resLambda = absL(3, 4) # вызов

# 2. Функция возвращающая модуль комплексного числа
#   Объявление функции
def absF(a, b):
    return math.sqrt(a*a + b*b)
resFunc = absF(3,4) # вызов функции

# Вивід результату
print("resLambda = ", resLambda)
print("resFunc = ", resFunc)

Результат выполнения программы

resLambda = 5.0
resFunc = 5.0

Пример 3. Лямбда-выражение, которое определяет дискриминант квадратного уравнения по коэффициентам a, b, c.

# Лямбда-выражения и функции

# 1. Лямбда-выражение, которое вычисляет дискриминант на основе коэффициентов a, b, c
discrL = lambda a, b, c: b*b - 4*a*c
print("discrLambda = ", discrL(3,4,5))

# 2. Функция, которая возвращает дискриминант на основе коэффициентов a, b, c
# Объявление функции
def discrF(a, b, c):
    return b*b-4*a*c

print("discrFunc = ", discrF(3,4,5))

Результат выполнения программы

discrLambda = -44
discrFunc = -44

 

6. Примеры использования лямбда-выражений как литералов списков

Пример 1. Использование лямбда-выражения как литерала списка.

На основе лямбда-выражений сформировать список случайных чисел от 0 до 1.

# Лямбда-выражения как литералы списков

import random

# Словарь, в котором формируются три случайные числа
# с помощью лямбда-выражения
L = [ lambda : random.random(),
    lambda : random.random(),
    lambda : random.random() ]

# Вывести результат
for l in L:
    print(l())

Результат выполнения программы

0.5129490134837236
0.8638007610222296
0.915211196027481

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

# Лямбда-выражения как литералы кортежей

import random

# Кортеж, в котором формируются три литерала-строки
# с помощью лямбда-выражения
T = ( lambda x: x*2,
    lambda x: x*3,
    lambda x: x*4 )

# Вывести результат для строки 'abc'
for t in T:
    print(t('abc'))

Результат выполнения программы

abcabc
abcabcabc
abcabcabcabc

 

7. Примеры использования лямбда-выражений для формирования таблиц переходов в словарях

Пример 1. Использование лямбда-выражения для формирования таблиц переходов.

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

# Лямбда-выражения и таблицы переходов

# Словарь, который есть таблицей переходов
Dict = {
    1 : (lambda: print('Monday')),
    2 : (lambda: print('Tuesday')),
    3 : (lambda: print('Wednesday')),
    4 : (lambda: print('Thursday')),
    5 : (lambda: print('Friday')),
    6 : (lambda: print('Saturday')),
    7 : (lambda: print('Sunday'))
    }

# Вызвать лямбда-выражение, выводящее название вторника
Dict[2]() # Tuesday

Пример 2. Формируется таблица переходов (словарь) Area, в которой вычисляется площадь известных фигур.

# Лямбда-выражения и таблицы переходов

import math

# Словарь, представляющий собой таблицу переходов, в которой под названием
# фигуры выводится ее площадь
Area = {
    'Circle' : (lambda r: math.pi*r*r), # окружность
    'Rectangle' : (lambda a, b: a*b),   # прямоугольник
    'Trapezoid' : (lambda a, b, h: (a+b)*h/2.0) # трапеция
    }

# Вызвать лямбда-выражение, которое выводит площадь окружности радиуса 2
print('Area of circle = ', Area['Circle'](2))

# Вывести площадь прямоугольника размером 10*13
print('Area of rectangle = ', Area['Rectangle'](10, 13))

# Вывести площадь трапеции для a=7, b=5, h=3
areaTrap = Area['Trapezoid'](7, 5, 3)
print('Area of trapezoid = ', areaTrap)

Результат выполнения программы

Area of circle = 12.566370614359172
Area of rectangle = 130
Area of trapezoid = 18.0

 

8. Можно ли в лямбда-выражениях использовать стандартные операторы управления if, for, while?

Ответ: нет.

Согласно синтаксису лямбда-выражение размещается в одной строке. Если попытаться разместить в одной строке оператор while в теле лямбда-выражения, то интерпретатор Python выдаст ошибку «Invalid syntax» как показано ниже

# Здесь выдает ошибку: "Invalid syntax"
lmbd = lambda n: while n>0: n=n-1
print("lmbd = ", lmbd)

То же касается и других управляющих конструкций.

 


Связанные темы