image
Главная // Блог // Основы программирования // Функции в Python. Часть 2.

Функции в Python. Часть 2.

Функции Python. Часть 2 

Анонимные функции

Анонимные функции или лямбда-выражения – не являются ноу-хау Python, такие конструкции характерны для функциональных языков, таких как Haskell или Lisp. Появились они, благодаря деятельности двух математиков Алонзо Черча и Алана Тьюринга.

Python не является функциональным языком программирования, но некоторые элементы функциональных языков встроены в него.

Давайте разберемся, что же такое лямбда-выражения и как с ними работать. Как можно заметить из названия “анонимная функция”, лямбда-выражение в буквальном смысле является функцией, у которой отсутствует имя:

def simple_sqr(x):
    return x*x


lambda_sqr = lambda x: x*x

print(lambda_sqr(5)) #25
print(simple_sqr(6)) #36


В данном примере мы написали обычную именованную, def-функцию и лямбда-выражение, которые возводит число в квадрат. Вы можете справедливо возразить, сказав, что не видите здесь ни одной анонимной функции, есть simple_sqr и lambda_sqr, к которой присваивается странная конструкция. Этот пример является несколько надуманным, если записать это выражение в PyCharm, то услужливая среда разработки заметит: “PEP 8: do not assign a lambda expression, use a def”, что в прямом смысле означает, что не надо мудрить с лямбда-выражениями, используйте обычную именованную def-функцию. Однако на данном примере легко проследить логику анонимных функций их синтаксис:

Ключевое слово: lambda

Аргумент (то, что мы передаем в функцию): x

Тело функции (действие над аргументом): x*x

Собственно, по такому принципу строятся все анонимные функции, аргументов может быть несколько, в тело функции можно нельзя писать операторы по типу return. Но логические выражения в анонимных функциях все же используются, например можно написать лямбда-выражения для определения четности/нечетности числа:

print((lambda x: 'even' if x % 2 == 0 else 'odd')(5)) #odd
print((lambda x: 'even' if x % 2 == 0 else 'odd')(4)) #even

Так в чем же преимущество лямбда-выражений над обычными функциями? Их немного, первое – это сокращение строчек кода до одной, но это снижает читаемость кода, особенно для новичков. Вторым преимуществом является возможность использовать лямбда-выражения на лету, сразу передавать их в другие функции, которые также являются элементами функционального программирования, поговорим о некоторых из них поподробнее.

Функция map()

Функция map(function, iterator) принимает в себя два аргумента – функцию, которую мы хотим использовать и данные, которые будут преобразованы в соответствии с этой функцией, например map очень удобен при создании нового списка на основе существующего, в первом примере мы переводим список символов в список чисел. Второй пример как раз-таки показывает нам преимущество лямбда-выражений, мы формируем новый список, возводя каждое число в квадрат, и все это можно записать в одну строку, как показано в примере:

str_list = ['1', '2', '3', '4', '5'] #рассмотрим список с элементами типа string

int_list = list(map(int, str_list)) #преобразуем их в int

print(int_list) #[1, 2, 3, 4, 5]

sqr_list = list(map(lambda x: x*x, int_list)) #возведем их в квадрат

print(sqr_list) #[1, 4, 9, 16, 25]

print(list(map(lambda x: x*x, list(map(int, str_list)))))#вышеизложенный код в одну строку

Также замечу, что в map можем передавать несколько элементов, которые могут быть разной длины, но map будет выполнять действие только по минимальному элементу.

Функция reduce()

Функция reduce(function, iterator) похожа на map за одним исключением, она возвращает одно единственное значение. На основе этого определения можно сделать вывод, в каких же ситуациях функция reduce может быть применена, например нам надо узнать сумму или найти максимальное значение при определенных условиях:

from functools import reduce
print(sqr_list) #[1, 4, 9, 16, 25, 36]
print(reduce(lambda x, y: x + y, sqr_list)) #91 

Синтаксис reduce похож на map, нам необходимо передать значения и некий функционал для их обработки. Замечу, что функции reduce не является стандартной и для ее использования нам необходимо подключить библиотеку functools.

Функция filter()

Как видно из названия, filter(function, iterator) – фильтрует элементы по заданным условиям, синтаксис filter также совпадает с map, нам необходимо передать туда условия, по которым будут отбираться значения и сами значения. В нашем примере, мы ищем в строке слова с количеством символов больше 5:

str = 'We learn python with ai-Simple'
new_list = str.split() #['We', 'learn', 'python', 'with', 'ai-Simple']
print(list(filter(lambda x: len(x) > 5, new_list))) #['python', 'ai-Simple']

Теги: python


Оставить комментарий
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.

Похожие новости

Искусственный интеллект — это просто!