Python. Аргументы по умолчанию в лямбда-выражениях

Аргументы по умолчанию в лямбда-выражениях. Лямбда-выражения в теле объемлющей функции. Вложенные лямбда-выражения


Содержание


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




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

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

lambda arg1=value1, arg2=value2, ..., argN=valueN : expression

здесь

  • arg1, arg2, argN — имена аргументов, которые использует лямбда-выражение;
  • value1, value2, valueN — значения, которые присваиваются соответственно аргументам arg1, arg2, argN;
  • expression — непосредственно лямбда-выражение.

Если при вызове лямбда-выражения не указать значения аргументов, то им будут присвоены значения по умолчанию value1, …, valueN. Если указать только часть аргументов, то эта часть будет заменять значение по умолчанию начиная от крайнего левого аргумента (arg1).

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

# Использование аргументов по умолчанию в лямбда-выражениях

# Лямбда-выражение, которое получает 3 аргумента по умолчанию
summ = lambda a=1, b=2, c=3: a+b+c

print("summ() = ", summ()) # 1+2+3 = 6
print("summ(10) = ", summ(10)) # 10+2+3 = 15
print("summ(10, 20) = ", summ(10,20)) # 10+20+3 = 33
print("summ(10, 20, 30) = ", summ(10,20,30)) # 10+20+30 = 60

 

2. Примеры лямбда-выражений, содержащих аргументы по умолчанию

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

# Использование аргументов по умолчанию в лямбда-выражениях

import math

# Лямбда-выражение, возвращающее площадь окружности
areaCircle = (lambda r = 1: math.pi*r*r)

# Вычислить площадь окружности радиуса 5
area5 = areaCircle(5)
print("area5 = ", area5)

# Вычислить площадь окружности радиуса 1 - по умолчанию
area1 = areaCircle()
print("area1 = ", area1)

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

area5 = 78.53981633974483
area1 = 3.141592653589793

Пример 2. Вычисление расстояния от точки с координатами (x; y) до начала координат. Координата точки получает по умолчанию значение x = 1, y = 1.

# Использование аргументов по умолчанию в лямбда-выражениях

import math

# Лямбда-выражение, возвращающее расстояние от точки до начала координат
lengthOrigin = (lambda x=1, y=1: math.sqrt(x*x+y*y))

# Вычислить расстояние от точки (-5; 2) до начала координат
L = lengthOrigin(-5,2)
print("L(5;2) = ", L)

# Вычислить расстояние для точки по умолчанию (1; 1)
L = lengthOrigin(1,1)
print("L(1;1) = ", L)

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

L(5;2) = 5.385164807134504
L(1;1) = 1.4142135623730951

 

3. Использование лямбда-выражений в пределах объемлющей функции. Пример

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

  • если лямбда-выражение объявлено внутри функции, то эта функция считается объемлющей для данного лямбда-выражения. Соответственно это лямбда-выражение имеет доступ к именам объемлющей функции (смотрите ниже пример 1).

Пример. Данный пример демонстрирует объявление лямбда-выражения внутри функции. Объявляется функция GetRandomNumber(), которая возвращает целое число в диапазоне от 0 до 99. В теле функции сначала формируется вещественное случайное число в диапазоне [0..1]. Затем, объявляется лямбда-выражение, которое конвертирует это число в целое число, имеющее значение в диапазоне [0..99]. Как видно из кода ниже, лямбда-выражение имеет доступ к переменной number, которая объявляется в коде объемлющей функции GetRandomNumber().

# Использование лямбда-выражений в пределах объемлющей функции

import random

# Функция, возвращающая целое число в диапазоне от 0 до 99
def GetRandomNumber():
    # 1. Получить случайное число в диапазоне 0..1
    number = random.random()

    # 2. Объявить лямбда-выражение, которое
    # конвертирует вещественное число в диапазоне [0..1]
    # в целое число в диапазоне [0..99]
    number99 = lambda : int(number*100) # доступ к number

    # 3. Вернуть целое число
    return number99()

num = GetRandomNumber()
print("num = ", num)

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

num = 51

 

4. Вложенные лямбда-выражения. Пример

Как известно, лямбда-выражение объявляется в одной строке. Это несколько упрощает логику кода, который может быть использован в лямбда-выражении. Однако, в языке Python лямбда-выражения допускают вложения. С помощью вложений можно несколько разнообразить (усложнить) вычислительный код.

Общая форма вложенного лямбда-выражения выглядит примерно так

lambda arg11, ..., arg1N: (lambda arg21, ..., arg2N : expression)

здесь

  • arg11, arg1N – аргументы внешнего лямбда-выражения;
  • arg21, arg2N – аргументы вложенного лямбда-выражения.

Допускается несколько уровней вложений.

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

# Вложенные лямбда-выражения

# Вычислить сумму двух чисел
sum2 = (lambda a: (lambda b: a+b))
s = sum2(5)(4)
print("sum2(5)(4) = ", s)

# Вычислить сумму трех чисел
sum3 = (lambda a: (lambda b: (lambda c: a+b+c)))
print("sum3(2)(4)(6) = ", sum3(2)(4)(6))

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

sum2(5)(4) = 9
sum3(2)(4)(6) = 12

Как видно из вышеприведенного кода, в строках

sum2 = (lambda a: (lambda b: a+b))

и

sum3 = (lambda a: (lambda b: (lambda c: a+b+c)))

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

 


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