Skip to content

Latest commit

 

History

History
200 lines (144 loc) · 7.52 KB

File metadata and controls

200 lines (144 loc) · 7.52 KB

Специальные функции lambda, map, filter, zip


Функциональное программирование

В основном питоне это не Функциональный язык программирования, в питоне есть lambda функции, но используются они не часто, и если используются то для решения простейших задач.

Обычные функции именованы, lambda это тоже функция, но не именованная, так что при получении ошибки мы не увидим ее имени.

Основные инструменты функционального в питоне:

  1. lambda
  2. map
  3. filter
  4. zip

filter Функция

filter - специальная функция, что как и map применяет функцию к некоторой последовательности, но если map применяла функцию к каждому элементу и возвращала все элементы последовательности, то функция filter не меняет элементы последовательности, но использует полученную функцию для сортировки элементов.

Как и map функция filter возвращает особый обьект который требуется явно привести к структуре.

Функция на основе которой будет происходить фильтрация должна возвращать True / False таким образом эта функция будет применена к каждому элементу последовательности, и в отфильтрованные попадут только те значения для которых было возвращено True


Пример №1

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

    def filter_plus(number):
        if number > 0:
            return True
        return False

    some_list = [-10, -7, -5, 0, 1, 4, 5, 7, 12]

    result = list(filter(filter_plus, some_list))    
    print(result)

    # Вывод
    # [1, 4, 5, 7, 12]

lambda Функция

Это анонимная функция, по сути представляет собой выражение, используется для удобной замены меленький стандартных функций, lambda автоматически применяет оператор return к результату вычисления.

Лямбда принимает любое количество аргументов (или ни одного), но состоит из одного выражения.

lambda arguments: expression

Иметь lambda функции из нескольких строк кода нельзя, только одно выражение.


Стандартная запись функций, требует создание функции и ее использование, к примеру след образом.

def make_sum(x, y):
    return x + y

print(make_sum(1, 2))

# Вывод 
# 3

Замена предыдущей функции на lambda функцию:

    make_sum = lambda x, y: x + y
    result = make_sum(1, 5)
    print(result)

    # Вывод 
    # 6

Таким образом мы создали функцию в переменной, и используем ее как функцию, однако PEP - рекомендации по работе с кодом питона, не советует использование lambda функций как полноценную замену настоящим функциям.

lambda функции обычно используются для замены некого одноразового действия с какой-либо структурой данных, примеру пройтись по всем элементам списка, и сделать некое простейшие действие.

Проблема может заключаться в том что если мы постоянно используем lambda выражения и где-то в них произойдет ошибка, то поймать ее будет проблематично, lambda функция не имеет имени, так что вы не увидите в отладке название функции в которой произошла ошибка.


Пример №1

Простейшее использование, передаем в lambda 2 переменные, складываем и возвращаем результат:

    some_lambda = lambda x, y: x + y
    print(some_lambda(10, 70))
    
    # Вывод
    # 80

Пример №2

Мы можем устанавливать значения по умолчанию, это полезно когда мы создаем функцию которая по умолчанию удваивает значение, но при необходимости можем передать второй аргумент.

    some_lambda = lambda x, y=2: print(x*y)
    some_lambda(10)

    some_lambda = lambda x, y=2: print(x*y)
    some_lambda(10, 5)

    # Вывод
    # 20
    # 50

Пример №3

Можно скомбинировать, labmda и map функции, map принимает 2 параметра, функцию которую требуется применить на некоторую последовательность, и саму последовательность, сделаем это, умножим на 2 каждый элемент последовательности, незабываем, что функция map возвращает особый объект типа map и его требуется явно превращать в последовательность.

    some_list = [1, 2, 3, 4, 5]

    result_1 = list(map(lambda x: x*2, some_list))
    print(result_1)
    
    # Вывод
    # [2, 4, 6, 8, 10]

Пример №4

Можно использовать специальную функцию filter для фильтрации последовательности, совместно с функцией lambda. Напишем 2 функции, одна фильтрует список и возвращает все четные элементы, другая после фильтрации возвращает нечетные элементы

    some_list = [-5, -3, -1, 0, 1, 2, 3, 4, 5, 10, 20, 21]

    # Получить нечетные элементы
    result_1 = list(filter(lambda number: True if number % 2 else False, some_list))

    # Получить четные элементы
    result_2 = list(filter(lambda number: False if number % 2 else True, some_list))

    print('Получить нечетные элементы : ', result_1)
    print('Получить четные элементы : ', result_2)

    # Вывод
    # Получить нечетные элементы :  [-5, -3, -1, 1, 3, 5, 21]
    # Получить четные элементы :  [0, 2, 4, 10, 20]