Лямбда-выражения. Анонимные функции. Ключевое слово lambda. Таблица переходов
Содержание
- 1. Анонимные функции. Понятия. Ключевое слово lambda. Общая форма
- 2. Случаи использования лямбда-выражений
- 3. Отличия между объявлением и использованием лямбда-выражений (lambda) и функций (def)
- 4. Преимущества использования лямбда-выражений
- 5. Примеры, демонстрирующие самые простые лямбда-выражения. Различия между инструкциями def и lambda. Вызов лямбда-выражений как имен
- 6. Примеры использования лямбда-выражений как литералов списков
- 7. Примеры использования лямбда-выражений для формирования таблиц переходов в словарях
- 8. Можно ли в лямбда-выражениях использовать стандартные операторы управления if, for, while?
- Связанные темы
Поиск на других ресурсах:
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)
То же касается и других управляющих конструкций.
⇑
Связанные темы
- Аргументы по умолчанию в лямбда-выражениях. Лямбда-выражения в теле объемлющей функции. Вложенные лямбда-выражения
- Реализация сложной логики в лямбда-выражениях. Проверка условия. Применение лямбда-выражений для последовательностей. Функции map(), filter(), reduce()
⇑