Какие инструменты для функционального программирования предоставляет модуль collections в Python?

Ответ

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

Ключевые инструменты:

  1. namedtuple: Фабрика для создания классов кортежей с именованными полями. Это повышает читаемость кода и позволяет создавать легковесные иммутабельные структуры данных, что является основой ФП.

    from collections import namedtuple
    
    # Создаем иммутабельный тип данных
    Point = namedtuple('Point', ['x', 'y'])
    p1 = Point(10, 20)
    
    print(p1.x) # Доступ по имени, а не по индексу
    # p1.x = 30 # Вызовет AttributeError, так как кортежи иммутабельны
  2. Counter: Специализированный подкласс словаря для подсчета хешируемых объектов. Упрощает агрегацию данных, позволяя писать более декларативный код.

    from collections import Counter
    
    # Декларативный подсчет элементов без циклов и условий
    data = ['apple', 'orange', 'apple', 'banana', 'orange', 'apple']
    fruit_counts = Counter(data)
    print(fruit_counts) # Counter({'apple': 3, 'orange': 2, 'banana': 1})
  3. defaultdict: Подкласс словаря, который вызывает фабричную функцию для предоставления значений по умолчанию для отсутствующих ключей. Это упрощает код группировки и агрегации, устраняя необходимость в ручных проверках ключей.

    from collections import defaultdict
    
    # Группировка данных без проверки наличия ключа
    s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
    d = defaultdict(list)
    for k, v in s:
        d[k].append(v)
    
    print(d) # defaultdict(<class 'list'>, {'yellow': [1, 3], 'blue': [2, 4], 'red': [1]})

Хотя defaultdict и Counter являются изменяемыми, они предоставляют высокоуровневые абстракции, которые помогают писать код в функциональном стиле, фокусируясь на трансформации данных, а не на деталях реализации.