Lambda-функции (лямбда-функции) - это анонимные функции, которые можно определить в одной строке. Они используются для создания небольших функций без необходимости использовать ключевое слово def.
map(), filter(), sorted()Синтаксис lambda-функции очень прост:
lambda аргументы: выражение
# Обычная функция
def умножить(x, y):
return x * y
# Эквивалентная lambda-функция
умножить = lambda x, y: x * y
# Использование
print(умножить(5, 3)) # Вывод: 15
Давайте сравним обычные функции с lambda-функциями:
# Обычная функция
def квадрат(x):
return x ** 2
print(квадрат(5)) # Вывод: 25
# Lambda-функция
квадрат = lambda x: x ** 2
print(квадрат(5)) # Вывод: 25
Функция map() применяет заданную функцию ко всем элементам итерируемого объекта.
# Список чисел
числа = [1, 2, 3, 4, 5]
# Использование lambda с map для возведения в квадрат
квадраты = list(map(lambda x: x ** 2, числа))
print(квадраты) # Вывод: [1, 4, 9, 16, 25]
# Преобразование температуры из Цельсия в Фаренгейт
температуры_цельсий = [0, 20, 30, 40]
температуры_фаренгейт = list(map(lambda c: (c * 9/5) + 32, температуры_цельсий))
print(температуры_фаренгейт) # Вывод: [32.0, 68.0, 86.0, 104.0]
Функция filter() создает итератор из элементов итерируемого объекта, для которых функция возвращает True.
# Список чисел
числа = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# Фильтрация четных чисел
четные = list(filter(lambda x: x % 2 == 0, числа))
print(четные) # Вывод: [2, 4, 6, 8, 10]
# Фильтрация строк по длине
слова = ["яблоко", "банан", "груша", "апельсин", "киви"]
длинные_слова = list(filter(lambda слово: len(слово) > 5, слова))
print(длинные_слова) # Вывод: ['яблоко', 'апельсин']
Функция sorted() может использовать lambda-функции для сортировки по пользовательским критериям.
# Список кортежей (имя, возраст)
люди = [("Анна", 25), ("Борис", 30), ("Виктория", 20), ("Дмитрий", 35)]
# Сортировка по возрасту
по_возрасту = sorted(люди, key=lambda человек: человек[1])
print(по_возрасту)
# Вывод: [('Виктория', 20), ('Анна', 25), ('Борис', 30), ('Дмитрий', 35)]
# Сортировка по длине имени
по_длине_имени = sorted(люди, key=lambda человек: len(человек[0]))
print(по_длине_имени)
# Вывод: [('Анна', 25), ('Борис', 30), ('Дмитрий', 35), ('Виктория', 20)]
Lambda-функции могут содержать условные выражения и более сложные конструкции:
# Тернарный оператор в lambda
абсолютное_значение = lambda x: x if x >= 0 else -x
print(абсолютное_значение(-5)) # Вывод: 5
print(абсолютное_значение(3)) # Вывод: 3
# Lambda с несколькими условиями
оценка = lambda баллы: "Отлично" if баллы >= 90 else "Хорошо" if баллы >= 70 else "Удовлетворительно" if баллы >= 50 else "Неудовлетворительно"
print(оценка(95)) # Вывод: Отлично
print(оценка(75)) # Вывод: Хорошо
print(оценка(45)) # Вывод: Неудовлетворительно
# Lambda с несколькими аргументами
расстояние = lambda x1, y1, x2, y2: ((x2 - x1) ** 2 + (y2 - y1) ** 2) ** 0.5
print(расстояние(0, 0, 3, 4)) # Вывод: 5.0
Задание 1:
import math
# Lambda-функция для вычисления площади круга
площадь_круга = lambda r: math.pi * r ** 2
# Список радиусов
радиусы = [1, 2, 3, 4, 5]
# Вычисление площадей
площади = list(map(площадь_круга, радиусы))
print(площади)
Задание 2:
# Список слов
слова = ["яблоко", "банан", "груша", "апельсин", "киви", "арбуз", "дыня"]
# Гласные буквы
гласные = "аеёиоуыэюя"
# Lambda-функция для проверки, начинается ли слово с гласной
начинается_с_гласной = lambda слово: слово[0].lower() in гласные
# Фильтрация слов
слова_с_гласной = list(filter(начинается_с_гласной, слова))
print(слова_с_гласной)
Задание 3:
# Список словарей
студенты = [
{"имя": "Анна", "возраст": 20, "средний_балл": 4.5},
{"имя": "Борис", "возраст": 22, "средний_балл": 3.8},
{"имя": "Виктория", "возраст": 19, "средний_балл": 4.9},
{"имя": "Дмитрий", "возраст": 21, "средний_балл": 4.2}
]
# Сортировка по среднему баллу
по_баллам = sorted(студенты, key=lambda студент: студент["средний_балл"], reverse=True)
print(по_баллам)
Задание 4:
# Рекурсивная lambda-функция для вычисления факториала
факториал = lambda n: 1 if n <= 1 else n * факториал(n - 1)
# Тестирование
print(факториал(5)) # Вывод: 120
print(факториал(0)) # Вывод: 1