← Назад к вопросам

На каких функциях работает funk?

1.6 Junior🔥 31 комментариев
#Другое

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Модуль Funk в Python: функции и возможности

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

Основные функции Funk

1. map() — преобразование элементов

Применяет функцию к каждому элементу последовательности:

from funk import map

numbers = [1, 2, 3, 4, 5]
result = map(lambda x: x ** 2, numbers)
# [1, 4, 9, 16, 25]

2. filter() — выборка элементов

Отбирает элементы, удовлетворяющие условию:

from funk import filter

numbers = [1, 2, 3, 4, 5]
evens = filter(lambda x: x % 2 == 0, numbers)
# [2, 4]

3. reduce() — свёртка/агрегация

Объединяет элементы в один результат:

from funk import reduce
from operator import add

numbers = [1, 2, 3, 4, 5]
total = reduce(add, numbers)
# 15

# Или через lambda
total = reduce(lambda acc, x: acc + x, numbers, 0)
# 15

4. compose() — композиция функций

Создаёт новую функцию из комбинации других:

from funk import compose

def add_two(x):
    return x + 2

def multiply_by_three(x):
    return x * 3

# Композиция: сначала add_two, потом multiply_by_three
process = compose(multiply_by_three, add_two)
result = process(5)
# add_two(5) = 7
# multiply_by_three(7) = 21

5. pipe() — конвейер функций

Применяет серию функций по порядку (слева направо):

from funk import pipe

def add_two(x):
    return x + 2

def multiply_by_three(x):
    return x * 3

# pipe: сначала add_two, потом multiply_by_three
process = pipe(add_two, multiply_by_three)
result = process(5)
# add_two(5) = 7
# multiply_by_three(7) = 21

6. partial() — частичное применение

Фиксирует некоторые аргументы функции:

from funk import partial

def multiply(x, y):
    return x * y

# Фиксируем первый аргумент
multiply_by_two = partial(multiply, 2)
result = multiply_by_two(5)
# 10

7. curry() — каррирование

Преобразует функцию с несколькими аргументами в цепочку функций с одним аргументом:

from funk import curry

@curry
def add(x, y):
    return x + y

add_five = add(5)
result = add_five(3)
# 8

8. identity() — функция идентичности

Просто возвращает свой аргумент (полезна как default функция):

from funk import identity

result = identity(42)
# 42

# Полезна в map и filter
values = [1, 2, 3, None, 5]
filtered = filter(identity, values)
# [1, 2, 3, 5] — отфильтрованы falsy значения

Практические примеры использования

Обработка данных пользователей

from funk import compose, map, filter

users = [
    {'name': 'Alice', 'age': 25, 'active': True},
    {'name': 'Bob', 'age': 17, 'active': False},
    {'name': 'Charlie', 'age': 30, 'active': True},
]

# Фильтруем активных пользователей старше 18
adult_active = filter(
    lambda u: u['active'] and u['age'] >= 18,
    users
)

# Извлекаем только имена
names = map(lambda u: u['name'], adult_active)
print(list(names))  # ['Alice', 'Charlie']

Цепочка трансформаций с pipe

from funk import pipe, map

def parse_json(data):
    import json
    return json.loads(data)

def extract_ids(users):
    return map(lambda u: u['id'], users)

def to_list(items):
    return list(items)

process = pipe(
    parse_json,
    extract_ids,
    to_list
)

json_data = '[{"id": 1, "name": "A"}, {"id": 2, "name": "B"}]'
ids = process(json_data)
# [1, 2]

Комбинирование функций

from funk import compose, partial

def multiply(x, y):
    return x * y

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

# Создаём специализированные функции
add_ten = partial(add, 10)
multiply_by_two = partial(multiply, 2)

# Комбинируем их
process = compose(multiply_by_two, add_ten)
result = process(5)
# add_ten(5) = 15
# multiply_by_two(15) = 30

Funk vs встроенные функции Python

ФункцияВстроеннаяFunkРазличия
mapЕстьЕстьFunk часто возвращает список
filterЕстьЕстьРазличия в обработке
reducefunctools.reduceЕстьFunk имеет более удобный API
composeНетЕстьFunk специализирован
pipeНетЕстьУдобнее для цепочек
partialfunctools.partialЕстьАналог встроенной
curryНетЕстьКаррирование

Когда использовать Funk

  • Функциональное программирование — когда вы предпочитаете FP стиль Python
  • Обработка потоков данных — сложные трансформации через цепочки функций
  • Композиция функций — когда нужна гибкая комбинация логики
  • Работа с коллекциями — когда нужны удобные map/filter/reduce

Практический пример: обработка числовых данных

from funk import pipe, map, filter, reduce
from operator import add

data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# Цепочка: фильтруем чётные → квадратируем → суммируем
result = pipe(
    filter(lambda x: x % 2 == 0, data),
    map(lambda x: x ** 2),
    reduce(add, initial=0)
)

print(result)
# filter: [2, 4, 6, 8, 10]
# map: [4, 16, 36, 64, 100]
# reduce: 220

Заключение

Функ — это мощный инструмент для функционального программирования в Python. Он работает на всех обычных функциях (встроенных, пользовательских, lambda) и позволяет писать выразительный, чистый и легко тестируемый код через композицию и цепочки функций. Особенно полезен для обработки данных и трансформаций сложных структур.

На каких функциях работает funk? | PrepBro