💻 Примеры

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

Урок повторяет модули 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 как ключ словаря.

Измерение времени

Сравним скорость создания объекта range и списка.

import time

start = time.time()
values = range(1_000_000)
elapsed_range = time.time() - start

start = time.time()
values_list = list(range(1_000_000))
elapsed_list = time.time() - start

print(f"range: {elapsed_range:.10f} сек")
print(f"list:  {elapsed_list:.10f} сек")

OrderedDict как очередь задач

Перемещаем задачи с высоким приоритетом в начало, а с низким — в конец.

from collections import OrderedDict

queue = OrderedDict([
    ("task1", "low"),
    ("task2", "high"),
    ("task3", "low"),
])

for key, value in list(queue.items()):
    if "high" in value:
        queue.move_to_end(key, last=False)
    elif "low" in value:
        queue.move_to_end(key)

print(queue)

LRU-кэш на практике

Декоратор ускоряет рекурсивное вычисление чисел Фибоначчи.

from functools import lru_cache

@lru_cache(maxsize=128)
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)

print(fibonacci(35))
print(fibonacci.cache_info())

frozenset как ключ словаря

Используем неизменяемое множество там, где обычный set не подходит.

frozen = frozenset(["read", "write"])
permissions = {frozen: "editor"}
print(permissions[frozen])

Основные операции со словарём

Добавление, обновление, проверка ключа и удаление.

profile = {"name": "Alice", "age": 30}
profile["city"] = "Berlin"
profile.update({"age": 31, "email": "alice@example.com"})

if "email" in profile:
    print(profile["email"])

removed = profile.pop("email")
print(f"Удалено: {removed}")
print(profile)

Передача функции в функцию

Функцию можно передать как аргумент и вызвать внутри обёртки.

def double(x):
    return x * 2

def apply(func, data):
    return [func(x) for x in data]

print(apply(double, [1, 2, 3]))

Lambda с сортировкой

Сортируем список кортежей по нескольким критериям.

people = [("Mike", 19), ("Nancy", 35), ("Oscar", 33), ("Frank", 33)]

by_age = sorted(people, key=lambda p: p[1])
by_age_name = sorted(people, key=lambda p: (-p[1], p[0]))

print(by_age)
print(by_age_name)
Проверить по документации: современные детали поведения встроенных функций, стандартной библиотеки и версии Python сверяйте с официальной документацией.