Кодировки, сырые строки и многострочные строки
Тема дорожной карты · Python Programming
В Python str — это Unicode, а bytes — сырые байты. Кодировка (utf-8, cp1251 и т.д.) служит мостом между ними, и большая часть багов с «кракозябрами» — это декодирование байтов не тем кодеком. Используй сырые строки r"..." для регулярок и Windows-путей, чтобы не ловить сюрпризы со escape-последовательностями, и тройные кавычки для многострочных литералов и docstring. Для подстановки бери f-строки; textwrap.dedent помогает убирать лишние отступы в многострочных блоках.
Как это работает
Кодировки, сырые строки и многострочные строки покрывает четыре встроенных контейнера (list, tuple, set, dict) плюс модуль collections (Counter, defaultdict, deque, namedtuple, OrderedDict). Списки — изменяемые упорядоченные последовательности с O(1) append; кортежи — неизменяемые; множества — на хешах с O(1) проверкой членства; словари — хеш-таблицы с гарантированным порядком вставки с Python 3.7. Comprehensions ([x*2 for x in xs]) создают эти контейнеры в одном выражении и обычно быстрее явных циклов.
Когда применять
Выбор контейнера диктует паттерн доступа: list — упорядоченный доступ по индексу, tuple — fixed-size записи или ключи словаря, set — членство/дедуп, dict — поиск по ключу. Comprehensions — когда трансформация очевидна (читаемый one-liner); generator expressions — когда данных много и их можно стримить. Берите collections.Counter для подсчёта частот, defaultdict чтобы избежать setdefault-бойлерплейта, deque для FIFO/LIFO с O(1) на обоих концах.
Типичные ошибки
Ловушки Кодировки, сырые строки и многострочные строки: копирование вложенных списков через = (получаете ссылку, не копию — нужен copy.deepcopy); использование изменяемых объектов как ключей словаря (TypeError); итерация + мутация списка одновременно (размер меняется в цикле = пропуски); выбор list-of-tuples вместо dict — и O(1) превращается в O(n). Профилируйте через timeit, прежде чем считать comprehension быстрее — иногда явный цикл с .append выигрывает в ясности.