🐛 Типичные ошибки

⚡ Кратко: что важно

Урок повторяет модули time и collections (OrderedDict, Counter, deque, defaultdict), frozenset, functools.lru_cache, основы работы со словарями, передачу функций, lambda и парадигмы программирования.

Что запомнить: функцию передают без скобок; @lru_cache(maxsize=...) кэширует результаты; frozenset неизменяем и хешируем; OrderedDict управляет порядком через move_to_end() и popitem().

Топ-3 ошибки: передавать func() вместо ссылки func; забывать list() вокруг map/filter; пытаться изменить frozenset или использовать обычный set как ключ словаря.

Передача func() вместо func

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

def square(x):
    return x * x

def apply(func, value):
    return func(value)

# правильно: передаём ссылку
print(apply(square, 5))
# неправильно: apply(square(5), 5) вызовет ошибку

Забытый list() вокруг map/filter

map и filter возвращают ленивые итераторы. Для вывода их нужно преобразовать в список.

numbers = [1, 2, 3, 4]
squares = list(map(lambda x: x ** 2, numbers))
print(squares)

Изменение frozenset

У frozenset нет методов add и remove. Для изменяемого множества используйте set.

frozen = frozenset([1, 2, 3])
# frozen.add(4)  # AttributeError
mutable = set(frozen)
mutable.add(4)
print(mutable)

Попытка использовать set как ключ словаря

Обычное множество не хешируемо. Если нужно множество в качестве ключа, используйте frozenset.

# keys = { {1, 2}: "value" }  # TypeError
keys = { frozenset([1, 2]): "value" }
print(keys)

Слишком сложная lambda

Если выражение не умещается в одну строку, лучше заменить lambda именованной функцией.

def order_key(person):
    name, age = person
    return -age, name

people = [("Mike", 19), ("Nancy", 35)]
print(sorted(people, key=order_key))