Аргументи за замовчуванням у лямбда-виразах. Лямбда-вирази в тілі об’ємлючої функції. Вкладені лямбда-вирази
Зміст
- 1. Використання аргументів за замовчуванням у лямбда-виразах. Приклад
- 2. Приклади лямбда-виразів, що містять аргументи за замовчуванням
- 3. Використання лямбда-виразів у тілі об’ємлючої функції. Приклад
- 4. Вкладені лямбда-вирази. Приклад
- Зв’язані теми
Пошук на інших ресурсах:
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)))
всередині лямбда-виразу створюється інша функція. У всіх випадках, лямбда-вирази нижнього рівня мають доступ до змінних об’ємлючих лямбда-виразів (функцій).
⇑
Зв’язані теми
- Лямбда-вирази. Анонімні функції. Ключове слово lambda. Таблиця переходів
- Реалізація складної логіки у лямбда-виразах. Перевірка умови. Застосування лямбда-виразів для послідовностей. Функції map(), filter(), reduce()
⇑