Python. Реалізація складної логіки у лямбда-виразах

Реалізація складної логіки у лямбда-виразах. Перевірка умови. Застосування лямбда-виразів для послідовностей. Функції map(), filter(), reduce()


Зміст


Пошук на інших ресурсах:




1. Як забезпечити перевірку умови в лямбда-виразі? Приклад

Як відомо, у лямбда-виразі неможливо застосувати оператор if у його звичайній формі. Однак, лямбда-вираз може використовувати оператор умови, який має наступну загальну форму

result1 if condition else result2

тут

  • condition – умовний вираз;
  • result1 – результат, який повертається якщо значення condition=true;
  • result2 – результат, який повертається якщо condition=false.

Приклад. Демонструється код лямбда-виразів, які повертають максимальні та мінімальні значення між двома вхідними об’єктами.

# Перевірка умови у лямбда-виразі

# Обчислення максимального значення між двома числами
maximum = (lambda a, b: a if a>b else b)
print(maximum(15, 13))

# Мінімальне значення між трьома числами a, b, c
min = (lambda a, b, c: a if (a<=b)and(b<=c) else (b if (b<=a)and(b<=c) else c))
print(min(9,8,5))

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

15
5

 

2. Застосування лямбда-виразів до послідовностей. Функція map(). Приклади

Якщо всередині лямбда-виразу потрібно циклічно обробити послідовність (список, кортеж), то для цього доцільно використовувати функцію map()

map(func, *iterables)

тут

  • func – функція, яка повинна бути застосована до кожного елементу послідовності iterables;
  • iterables – ітерований об’єкт, що є послідовністю (наприклад, список).

Функція повертає список, що містить результати всіх викликів функції func().

Приклад 1. Використати функцію map() для отримання нового списку, в якому кожен елемент подвоюється. Продемонструвати роботу функції для двох випадків:

  • без використання лямбда-виразу;
  • з використанням лямбда-виразу.
# Використання лямбда-виразів для обробки послідовностей

# Задача. Помножити кожен елемент послідовності на 2.
# Використати лямбда-вираз та функцію map()

# 1. Оголосити функцію, яка множить число на 2
def Mult2(t):
    return t*2

# 2. Тестувальний список
L = [ 2, 8, 12, -5, -10 ]

# 3. Застосувати функцію map() без лямбда-виразу на основі функції Mult2()
L2 = list(map(Mult2, L))
print("L2 = ", L2)

# 4. Застосувати функцію map() з лямбда-виразом
L3 = list(map((lambda t: t*2), L))
print("L3 = ", L3)

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

L2 = [4, 16, 24, -10, -20]
L3 = [4, 16, 24, -10, -20]

Приклад 2. У прикладі демонструється застосування функції map() та лямбда-виразу до кортежу. Кожен елемент кортежа приводиться до цілого типу.

# Використання лямбда-виразів для обробки послідовностей

# Застосування лямбда-виразу та функції map() для кортежу

# 1. Оголосити тестувальний кортеж
T = ( 2.88, -1.75, 100.55 )

# 2. Отримати новий кортеж, в якому здійснюється приведення
# елементів послідовності до цілого типу
T2 = tuple(map((lambda x: int(x)), T))

# 3. Вивести результат
print("T2 = ", T2) # T2 = (2, -1, 100)

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

T2 = (2, -1, 100)

 

3. Вибірка даних у послідовності. Функція filter(). Приклади

Для вибірки даних з послідовності використовується функція filter(). Загальна форма функції

filter(func or None, iterable)

тут

  • func – ім’я функції, яка застосовується до об’єкту iterable;
  • iterable – ітерований об’єкт (список, кортеж).

Функція повертає відфільтрований об’єкт.

Приклад 1. Для заданого кортежу рядків формується новий кортеж, який містить рядки довжиною 3 символи.

# Використання лямбда виразів для обробки послідовностей

# Застосування лямбда-виразу та функції filter() для кортежу

# 1. Оголосити тестувальний кортеж
T = ( 'abcd', 'abc', 'cdefg', 'def', 'ghi' )

# 2. Отримати новий кортеж, в якому реалізовані рядки довжиною 3 символи
T2 = tuple(filter((lambda s: len(s)==3), T))

# 3. Вивести результат
print("T2 = ", T2) # T2 = ('abc', 'def', 'ghi')

Результат роботи програми

T2 = ('abc', 'def', 'ghi')

Приклад 2. Для заданого списку чисел формуються числа з діапазону [10; 20]. Продемонстровано роботу функції filter() для функції та лямбда-виразу.

# Обробка послідовностей у лямбда-виразах

# Застосування лямбда-виразу та функції filter() для списку

# 1. Оголосити тестувальний список
L = [ 8, 15, 7, 3, 11, 23, 187, -5, 20, 17 ]

# 2. Використати лямбда-вираз для рішення задачі
L2 = list(filter((lambda t: (t>=10)and(t<=20)), L))
print("L2 = ", L2) # L2 = [15, 11, 20, 17]

# 3. Використати функцію для рішення задачі
def Range_10_20(t):
    return (t>=10)and(t<=20)

L3 = list(filter(Range_10_20, L))
print("L3 = ", L3)

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

L2 = [15, 11, 20, 17]
L3 = [15, 11, 20, 17]

 

4. Обробка послідовностей. Застосування лямбда-виразу в функції reduce(). Приклад

Функція reduce() дозволяє отримати об’єкт, який є результатом деякої операції над послідовністю (наприклад, сума елементів послідовності). Функція reduce() може бути використана як для функцій так і для лямбда-виразів.

Загальна форма оголошення функції наступна

reduce(func, sequence)

тут

  • func – функція або лямбда-вираз, що задає формулу обчислення двох сусідніх елементів;
  • sequence – послідовність, яку потрібно обробити.

Функція reduce() повертає об’єкт, що є результатом обробки.

Приклад. У прикладі демонструється застосування функції reduce() для обчислення суми елементів послідовності. Для отримання формули обчислення, застосовується лямда-вираз та додаткова функція.

# Використання лямбда-виразів для обробки послідовностей

import functools

# Застосування лямбда-виразу у функції reduce()

# 1. Оголосити тестувальний список
L = [ 1.88, 3, 2.4, 3.6, 4.8 ]

# 2. Обчислити суму елементів списку з допомогою лямбда-виразу
summ1 = functools.reduce((lambda a, b: a+b), L)
print("summ1 = ", summ1)

# 3. Оголосити функцію та використати її в функції reduce()
def Add(x, y):
    return x+y

summ2 = functools.reduce(Add, L)
print("summ2 = ", summ2)

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

summ1 = 15.68
summ2 = 15.68

 


Зв’язані теми