Урок по треку Python 8 мин

Стандартная библиотека Python, которую ждут на собесе

collections, itertools, functools, heapq, bisect, datetime, pathlib, json, re и logging на практике.

«Батарейки в комплекте»: половину задач live coding можно решить в три строки, если знать стандартную библиотеку. Интервьюер это ценит: значит, вы не изобретаете велосипед и в продакшене тоже.

collections

from collections import Counter, defaultdict, deque, namedtuple

Counter('mississippi').most_common(2)      # [('i', 4), ('s', 4)]
graph = defaultdict(list); graph['a'].append('b')
q = deque(maxlen=3)                         # хранит последние 3

Counter поддерживает +, -, &, | и total() (3.10+).

heapq и bisect

import heapq, bisect

heapq.nsmallest(3, nums)          # топ-k за O(n log k)
heap = []; heapq.heappush(heap, (priority, task))
heapq.merge(sorted_a, sorted_b)   # ленивое слияние отсортированных

i = bisect.bisect_left(sorted_list, x)   # позиция вставки, O(log n)
bisect.insort(sorted_list, x)            # вставка с сохранением порядка, O(n)

heapq это мин-куча на обычном списке. Для макс-кучи кладут -x или кортежи с обратным ключом.

itertools и functools

  • itertools: chain, islice, groupby, accumulate, product, combinations, permutations, pairwise (3.10+), batched (3.12+).
  • functools: cache, lru_cache, partial, reduce, wraps, cached_property, total_ordering, singledispatch.

Дата и время

from datetime import datetime, timedelta, timezone
from zoneinfo import ZoneInfo

now = datetime.now(timezone.utc)                      # aware, с таймзоной
msk = now.astimezone(ZoneInfo('Europe/Moscow'))
deadline = now + timedelta(days=3)
datetime.fromisoformat('2026-10-15T09:30:00+03:00')

Правило: храните и сравнивайте время в UTC с указанной таймзоной (aware), переводите в локальное только при показе. Сравнение naive и aware бросает TypeError. datetime.utcnow() устарел с 3.12: он возвращает naive-время.

pathlib и файлы

from pathlib import Path

root = Path(__file__).parent
for p in root.glob('**/*.json'):
    data = json.loads(p.read_text(encoding='utf-8'))

Всегда указывайте encoding='utf-8' при работе с текстом: кодировка по умолчанию зависит от платформы (в Windows это до сих пор не всегда UTF-8, хотя UTF-8 mode становится стандартом).

json, csv, re

  • json.dumps(obj, ensure_ascii=False) чтобы кириллица не превратилась в А. default=str для дат и Decimal.
  • csv.DictReader читает строки как словари, newline='' при открытии файла.
  • re: re.compile для повторного использования, fullmatch для проверки целой строки, именованные группы (?P<name>...), нежадные *?. Сырые строки r'\d+', чтобы не экранировать слеши.

logging

import logging
logger = logging.getLogger(__name__)
logger.info('заказ %s оплачен', order_id)   # ленивое форматирование
logger.exception('не удалось')              # уровень ERROR + traceback

Логгер на модуль через __name__, настройка один раз в точке входа, print в сервисах не используют.

Ещё полезное

dataclasses, enum (StrEnum 3.11+), uuid, secrets (токены, а не random), hashlib, subprocess.run(..., check=True), tomllib (чтение TOML, 3.11+), argparse, contextlib, statistics.

Частые ошибки

  • random для токенов и паролей вместо secrets.
  • Naive-даты и смешение таймзон.
  • Открытие файлов без encoding.
  • bisect.insort в цикле на огромном списке: вставка всё равно O(n).
  • Форматирование строки до вызова логгера: logger.debug(f'...') форматирует, даже если DEBUG выключен.

Что спросят на собесе

  • Как найти k самых частых или k наибольших элементов.
  • Чем defaultdict отличается от dict.setdefault, что умеет Counter.
  • Как правильно работать с датами и таймзонами.
  • Чем secrets отличается от random.
  • Как настроить логирование и почему не print.

Закрепите за 5 минут

После урока в тренажёре 3-5 проверочных вопросов, дальше модуль уходит в повторения.

Вопросы модуля (33)