Происхождение названия
Лямбда-функции часто называют анонимными потому, что такую
функцию можно определить с помощью оператора lambda
, не давая ей название. Происхождение термина «лямбда» связано
с формальной системой λ-исчисления.
Назначение и особенности анонимных функций в Python
1. Лямбда-функции используются в качестве краткого способа
определения обычных def
функций. Например, так будет выглядеть стандартная функция
для вычисления дискриминанта:
А так – анонимная:
2. Анонимные функции используются однократно, в том участке
кода, где были определены. Если функцию нужно вызывать многократно, следует написать
обычную функцию def
.
Чаще всего анонимные функции используют совместно со встроенными функциями map(), filter(), sorted(), min(), max() и т. п. Особенно удобно применять
лямбда-функции для сортировки:
Вывод:
3. Присваивание лямбда-функциям имен не приводит к ошибке, но считается плохой практикой в соответствии с рекомендациями PEP8, поскольку противоречит самой концепции анонимности: такие функции используются однократно, и поэтому имена им не нужны:
4. Анонимные функции вызываются сразу после определения. Здесь лямбда-функция выполняет сортировку списка словарей по возрастанию цены:
Вывод:
5. Анонимные функции могут принимать неограниченное количество аргументов, но не могут содержать более одного выражения. Если в определении лямбда-функции записать два и более выражений, интерпретатор вернет ошибку:
Сообщение об ошибке:
6. Лямбда-функции можно включать в тело обычных функций. Эта функция будет удваивать все получаемые значения:
7. В анонимных функциях можно использовать условия и операторы
сравнения. Здесь анонимная функция добавляет слово гласная или согласная в
список в зависимости от того, является ли буква в строке st
гласной или согласной:
Вывод:
А в этом примере анонимная функция выбирает из исходного списка четные числа, превосходящие 6:
8. Анонимные функции являются замыканиями – им доступны внешние переменные. В этом примере внутренняя лямбда-функция принимает список и возвращает минимальный или максимальный элемент в зависимости от соответствующего параметра внешней функции:
Вывод:
9. В отличие от обычных функций, анонимные не могут содержать return, pass, assert и raise.
10. Подобно обычным функциям, лямбда-выражения поддерживают различные типы аргументов:
- позиционные;
- именованные;
- смешанные (позиционные + именованные);
- *args;
- **kwargs.
11. Лямбда-функции для проведения последовательных операций можно хранить в списках:
А также в словарях:
12. Во многих случаях лямбда-функции можно заменить списковыми включениями. К примеру, здесь анонимная функция используется для возведения элементов списка в куб:
Однако тот же результат можно получить проще:
Вывод:
А здесь лямбда-функция используется для выбора четных чисел из списка:
Вывод:
Точно такой же результат даст простое списковое включение:
Очень часто лямбда-функции используются совместно с filter():
В этом случае списковые включения также выглядят проще:
Вывод:
Практика
Задание 1
Напишите программу, которая получает от пользователя список, состоящий из целых чисел, и находит произведение его элементов. Решите задачу тремя способами:
- с помощью reduce и лямбда-функции;
- с math.prod();
- с использованием пользовательской функции.
Пример ввода:
Вывод:
Решение 1:
Решение 2:
Решение 3:
Задание 2
Напишите программу для сортировки значений словаря в алфавитном порядке.
Словарь:
Ожидаемый результат:
Решение:
Примечание: некоторые задачи, связанные с сортировкой словаря, можно также решать с помощью zip():
Задание 3
Напишите программу, которая получает от пользователя список, и выводит в алфавитном порядке все слова, состоящие из 5 букв. Решите задачу двумя способами – с использованием анонимной функции и с помощью спискового включения.
Пример ввода:
Вывод:
Решение 1:
Решение 2:
Задание 4
Напишите программу, которая:
- определяет текущую дату с помощью datetime.datetime.now();
- извлекает информацию о дне, месяце и годе с помощью анонимных функций;
- выводит день, месяц и год на экран.
Пример вывода:
Решение:
Примечание: без лямбда-функций задачу можно решить так:
Задание 5
Напишите программу, которая получает целое число n и выводит n первых элементов последовательности Фибоначчи.
Пример ввода:
Вывод:
Решение:
Задание 6
Напишите программу, которая получает от пользователя две строки с целыми числами и находит пересечение строк (общие для обеих строк элементы) без использования множеств.
Пример ввода:
Вывод:
Решение:
Задание 7
Напишите программу, которая сортирует полученную от пользователя строку с числами следующим образом:
- отрицательные числа идут после положительных;
- и положительные, и отрицательные числа упорядочены по возрастанию.
Пример ввода:
Вывод:
Решение:
Задание 8
Напишите программу, которая получает от пользователя две строки с числами, и выводит третью строку с поэлементными суммами чисел из первой и второй строк.
Пример ввода:
Вывод:
Решение:
Примечание: другой способ решения задачи – с использованием zip():
Задание 9
Напишите программу, которая получает 1) строку с набором слов; 2) одно слово, не входящее в предыдущую строку, и находит все анаграммы слова в строке.
Пример ввода:
Вывод:
Решение:
Задание 10
Напишите программу для проверки надежности пароля. Надежный пароль должен содержать не менее 9 символов; кроме того, в пароле должна быть хотя бы одна:
- буква в верхнем регистре;
- буква в нижнем регистре;
- цифра;
- и хотя бы один символа из набора !@#$%^&*()-+.
Пример ввода 1:
Вывод:
Пример ввода 2:
Вывод:
Решение:
Подведем итоги
Анонимные функции не могут в полной мере заменить обычные: синтаксис допускает использование всего одного выражения. Однако лямбда-выражения способны обрабатывать неограниченное количество аргументов, могут содержать любые условия и операторы сравнения, и их можно упаковать в список или словарь. В тех случаях, когда функция используется однократно, в особенности для фильтрации данных, лямбда-выражения очень удобны.
В следующей статье будем изучать рекурсивные функции.
Содержание самоучителя
- Особенности, сферы применения, установка, онлайн IDE
- Все, что нужно для изучения Python с нуля – книги, сайты, каналы и курсы
- Типы данных: преобразование и базовые операции
- Методы работы со строками
- Методы работы со списками и списковыми включениями
- Методы работы со словарями и генераторами словарей
- Методы работы с кортежами
- Методы работы со множествами
- Особенности цикла for
- Условный цикл while
- Функции с позиционными и именованными аргументами
- Анонимные функции
- Рекурсивные функции
- Функции высшего порядка, замыкания и декораторы
- Методы работы с файлами и файловой системой
- Регулярные выражения
- Основы скрапинга и парсинга
- Основы ООП: инкапсуляция и наследование
- Основы ООП – абстракция и полиморфизм
- Графический интерфейс на Tkinter
- Основы разработки игр на Pygame
- Основы работы с SQLite
- Основы веб-разработки на Flask
- Основы работы с NumPy
- Основы анализа данных с Pandas
Комментарии