«Батарейки в комплекте»: половину задач 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.