Python: полный мануал с примерами и справочником функций
Полный практический мануал Python: от установки и синтаксиса до файлов, сети, тестов и проектов. 25 глав, справочник функций и методов, упражнения с решениями и 195 проверенных примеров.

Python удобно изучать на задачах: посчитать расходы, разобрать текст, прочитать файл, собрать отчёт. В этом руководстве пройдём путь от установки и первых выражений до функций, классов, сети, тестов и самостоятельных проектов.
Выберите одну из 25 глав или найдите нужную функцию через поиск. В справочнике собраны все 73 позиции официальной таблицы встроенных функций и типов Python 3.15, а также 161 метод и 12 свойств строк, коллекций и путей. Для каждой позиции есть назначение, важный нюанс и ссылка на первичную документацию.
Код можно копировать и скачивать. 195 самостоятельных примеров проверены запуском на Python 3.15.0; у упражнений есть решения и ожидаемый результат. Новые возможности языка отмечены в тексте, а интерактивные фрагменты и команды установки объяснены отдельно.
Если начинаете с нуля, открывайте главы по порядку. Если решаете конкретную задачу, ищите по-русски или по имени Python: open, str.split, Path.read_text.
Все главы руководства 25
Глава 6 · начальный
Словари, множества и хешируемость
Выбрать структуру для поиска, уникальных значений и неизменяемых данных.
Словарь отвечает на вопрос «какое значение связано с этим ключом?», множество — «есть ли такой элемент?». Не выбирайте список только потому, что он уже знаком: поиск записи по идентификатору проще выразить словарём, а проверку уникальности — множеством. Структура данных задаёт договор о повторениях, порядке и допустимых ключах, поэтому её выбор влияет на смысл программы.
Ключи, значения и порядок вставки
dict связывает уникальные ключи со значениями. Присваивание существующему ключу заменяет его значение. В современных Python порядок вставки сохраняется, но это не автоматическая сортировка. Если запись удалена и добавлена снова, она окажется в конце. Для упорядоченного по цене отчёта по-прежнему нужен отдельный критерий сортировки.
Ключ должен быть хешируемым: его hash должен оставаться согласованным с равенством. Строки и числа подходят, список — нет. Кортеж подходит только когда хешируемы его элементы. Значения словаря могут быть изменяемыми. Учтите равенство ключей: 1 и True не создают независимые позиции, а строка "1" — отдельный ключ. Нормализуйте идентификатор до обращения к словарю.
Отсутствующий ключ и переданное None
data[key] при отсутствии вызывает KeyError. get(key, default) возвращает default и не вставляет ключ. Проблема возникает, когда None является допустимым значением: результат get(key) уже не различает отсутствие и явный None. Можно проверить членство, а для общего значения по умолчанию использовать отдельный маркер.
С Python 3.15 доступен встроенный sentinel(). Создайте один объект-маркер и сравнивайте с ним через is. Значение с тем же названием, созданное другим вызовом, не является вашим маркером. Для старых версий простой object() также подходит как внутренний уникальный маркер; новую возможность отмечайте рядом с кодом, а не используйте молча в проекте 3.14.
MISSING = sentinel("MISSING")
options = {"timeout": None, "retries": 0}
for key in ("timeout", "retries", "host"):
value = options.get(key, MISSING)
if value is MISSING:
print(key, "не задан")
else:
print(key, "задан:", value)
timeout задан: None retries задан: 0 host не задан
Представления и изменение словаря
keys(), values() и items() возвращают представления текущего словаря. После изменения словаря представление отражает новые данные. Если нужен независимый список на этот момент, создайте его через list. Не добавляйте и не удаляйте ключи во время обхода самого словаря: изменение размера нарушает итерацию. Подготовьте список нужных ключей или новый результат.
update() изменяет словарь на месте. Оператор left | right, доступный с 3.9, создаёт объединённый словарь; при совпадении ключа побеждает значение справа. Это удобно для конфигурации «базовые настройки плюс выбранные изменения». Порядок наложения должен быть явным: перестановка операндов может незаметно изменить результат.
base = {"theme": "light", "size": 10}
keys = base.keys()
snapshot = list(keys)
base["enabled"] = True
print(snapshot)
print(list(keys))
merged = base | {"size": 20}
print(merged["size"], base["size"])
['theme', 'size'] ['theme', 'size', 'enabled'] 20 10
setdefault и общая ссылка fromkeys
setdefault(key, default) возвращает существующее значение либо вставляет default и возвращает его. Для группы можно вызвать groups.setdefault(name, []).append(value). Помните, что выражение аргумента default вычисляется до вызова даже при уже существующем ключе. Для регулярно создаваемых групп defaultdict(list) часто выражает намерение понятнее.
dict.fromkeys(names, []) даёт каждому ключу одну и ту же ссылку на список. Изменение списка через один ключ проявится у остальных. Для независимых групп используйте {name: [] for name in names}. С неизменяемым общим значением, например None, fromkeys вполне удобен. Ошибка заключается не в методе, а в неверном ожидании отдельных изменяемых объектов.
Множества и хешируемый набор
set хранит уникальные хешируемые элементы. Пустое множество создаётся через set(); фигурные скобки {} создают словарь. Пересечение & находит общее, объединение | — всё, разность - — элементы только слева, симметрическая разность ^ — элементы ровно одного набора. Порядок множества не используйте как порядок отчёта: отсортируйте результат явно.
available = {101, 102, 103}
requested = {102, 104}
print("Доступны:", sorted(available & requested))
print("Отсутствуют:", sorted(requested - available))
key = frozenset({"read", "write"})
permissions = {key: "редактор"}
print(permissions[frozenset({"write", "read"})])
Доступны: [102] Отсутствуют: [104] редактор
frozenset — неизменяемое множество, которое можно использовать как ключ. Оно подходит, когда комбинация независима от порядка: набор разрешений или выбранных признаков. Если порядок важен, кортеж выражает другой договор. Превращение списка во множество удалит повторения; убедитесь, что повторы не являются количеством или повторными событиями, которые нужно сохранить.
Для изменения set есть add(), remove() и discard(). Remove сообщает KeyError при отсутствии элемента, discard спокойно сохраняет множество. Когда отсутствие нормально, второй вариант выражает это без дополнительного условия. pop() множества возвращает произвольный элемент; его нельзя использовать как обещание «самый старый» или «первый по алфавиту». Для порядка обработки выбирайте очередь либо отдельно отсортированный набор.
Counter, defaultdict и очередь
Counter считает повторения, defaultdict создаёт значение при обращении к отсутствующему ключу, deque удобно добавляет и удаляет элементы с обоих концов. Они входят в стандартный модуль collections. У defaultdict обычный get не запускает фабрику. Для очереди используйте popleft, а не удаление первого элемента большого списка со сдвигом остальных.
from collections import Counter, defaultdict, deque
counts = Counter("Код код сайт".casefold().split())
print(sorted(counts.items()))
groups = defaultdict(list)
groups["код"].append("Python")
print(groups["код"])
queue = deque(["проверить", "сохранить"])
print(queue.popleft())
queue.append("отправить")
print(list(queue))
[('код', 2), ('сайт', 1)]
['Python']
проверить
['сохранить', 'отправить']
frozendict: новое в Python 3.15
Встроенный frozendict сохраняет отображение без изменения его позиций после создания. Это отдельный тип, не подкласс dict. Порядок вставки сохраняется, равенство сравнивает содержимое. Хеширование возможно только при хешируемых ключах и значениях. Неизменяемость внешнего отображения не замораживает вложенные объекты: список внутри всё ещё остаётся списком.
config = frozendict({"tags": ["старт"]})
print(isinstance(config, dict))
config["tags"].append("код")
print(config["tags"])
try:
hash(config)
except TypeError:
print("Вложенный список не хешируется")
False ['старт', 'код'] Вложенный список не хешируется
Для неизменяемой конфигурации дополнительно выберите неизменяемые значения, например кортежи. Если нужен изменяемый черновик, создайте dict из готового отображения. Версионные особенности: новые встроенные типы 3.15.
Упражнение: независимые списки по отделам
Создайте отделы «дизайн» и «код» с отдельными списками задач. Добавьте задачу только в дизайн и проверьте, что список кода пуст. Затем напечатайте количество задач по каждому отделу. Не используйте один общий список как значение fromkeys.
Решение упражнения
departments = {name: [] for name in ("дизайн", "код")}
departments["дизайн"].append("обложка")
print({name: len(tasks) for name, tasks in departments.items()})
print(departments["код"])
{'дизайн': 1, 'код': 0}
[]
Методы и свойства dict
Все 11 публичных методов с отдельными сигнатурами dict.*; специальные методы и операторы вынесены за пределы этой карты.
dict.clearМетод · Изменение
Удаляет все пары из словаря.
Нюанс. Возвращает None и изменяет тот же объект словаря.
Официальная документация: dict.cleardict.copyМетод · Копирование
Создаёт поверхностную копию словаря.
Нюанс. Вложенные изменяемые значения остаются общими.
Официальная документация: dict.copydict.fromkeysМетод · Создание
Создаёт словарь с указанными ключами и одним начальным значением.
Нюанс. Один изменяемый value будет общим для всех ключей.
Официальная документация: dict.fromkeysdict.getМетод · Чтение
Возвращает значение ключа или запасное значение.
Нюанс. Не добавляет отсутствующий ключ, в отличие от setdefault().
Официальная документация: dict.getdict.itemsМетод · Перебор
Возвращает представление пар ключ–значение.
Нюанс. Представление отражает изменения словаря; менять размер словаря во время обхода нельзя.
Официальная документация: dict.itemsdict.keysМетод · Перебор
Возвращает представление ключей.
Нюанс. Это динамическое представление; для снимка используют list(d.keys()).
Официальная документация: dict.keysdict.popМетод · Изменение
Удаляет ключ и возвращает его значение.
Нюанс. Отсутствующий ключ вызывает KeyError, если default не указан.
Официальная документация: dict.popdict.popitemМетод · Изменение
Удаляет и возвращает последнюю добавленную пару.
Нюанс. Порядок LIFO гарантирован; пустой словарь вызывает KeyError.
Официальная документация: dict.popitemdict.setdefaultМетод · Изменение
Возвращает значение ключа и при отсутствии добавляет default.
Нюанс. Выражение default вычисляется заранее даже тогда, когда ключ существует.
Официальная документация: dict.setdefaultdict.updateМетод · Изменение
Добавляет пары и перезаписывает совпадающие ключи.
Нюанс. Изменяет словарь и возвращает None; не создаёт результирующий словарь.
Официальная документация: dict.updatedict.valuesМетод · Перебор
Возвращает представление значений.
Нюанс. Это динамическое представление; равенство двух представлений values не сравнивает наборы значений.
Официальная документация: dict.valuesМетоды и свойства set
Все 17 публичных методов с отдельными сигнатурами set.*.
set.isdisjointМетод · Проверки
Проверяет отсутствие общих элементов.
Нюанс. Метод принимает любой iterable, а не только множество.
Официальная документация: set.isdisjointset.issubsetМетод · Проверки
Проверяет, входят ли все элементы в другой набор.
Нюанс. Множество считается подмножеством самого себя.
Официальная документация: set.issubsetset.issupersetМетод · Проверки
Проверяет, содержит ли множество все элементы другого набора.
Нюанс. Равные множества проходят эту проверку.
Официальная документация: set.issupersetset.unionМетод · Новые множества
Создаёт объединение элементов.
Нюанс. Метод принимает iterable; оператор объединения требует множества.
Официальная документация: set.unionset.intersectionМетод · Новые множества
Создаёт множество общих элементов.
Нюанс. Не изменяет исходный набор, в отличие от intersection_update().
Официальная документация: set.intersectionset.differenceМетод · Новые множества
Создаёт множество элементов, отсутствующих в других наборах.
Нюанс. Порядок операндов меняет результат.
Официальная документация: set.differenceset.symmetric_differenceМетод · Новые множества
Создаёт множество элементов, встречающихся только в одном из двух наборов.
Нюанс. Общие элементы исключаются; метод принимает один другой iterable.
Официальная документация: set.symmetric_differenceset.copyМетод · Копирование
Получает поверхностную копию множества.
Нюанс. Копирование не создаёт глубокие копии объектов-элементов.
Официальная документация: set.copyset.updateМетод · Изменение
Добавляет элементы из одного или нескольких iterable.
Нюанс. Изменяет множество и возвращает None.
Официальная документация: set.updateset.intersection_updateМетод · Изменение
Оставляет в множестве только общие элементы.
Нюанс. Изменяет исходный объект и возвращает None.
Официальная документация: set.intersection_updateset.difference_updateМетод · Изменение
Удаляет элементы, встречающиеся в других наборах.
Нюанс. Изменяет исходный объект и возвращает None.
Официальная документация: set.difference_updateset.symmetric_difference_updateМетод · Изменение
Заменяет множество симметрической разностью.
Нюанс. Принимает один другой iterable и меняет исходный объект.
Официальная документация: set.symmetric_difference_updateset.addМетод · Изменение
Добавляет один элемент в множество.
Нюанс. Элемент должен быть хешируемым; повторное добавление не создаёт дубликат.
Официальная документация: set.addset.removeМетод · Изменение
Удаляет заданный элемент.
Нюанс. Отсутствующий элемент вызывает KeyError.
Официальная документация: set.removeset.discardМетод · Изменение
Удаляет элемент, если он присутствует.
Нюанс. Отсутствующий элемент не вызывает исключение.
Официальная документация: set.discardset.popМетод · Изменение
Удаляет и возвращает произвольный элемент.
Нюанс. Выбирать по порядку добавления нельзя; пустое множество вызывает KeyError.
Официальная документация: set.popset.clearМетод · Изменение
Удаляет все элементы множества.
Нюанс. Возвращает None и сохраняет сам объект.
Официальная документация: set.clearМетоды и свойства frozenset
Все 8 публичных методов frozenset; изменяющих методов нет.
frozenset.isdisjointМетод · Проверки
Проверяет отсутствие общих элементов.
Нюанс. Метод принимает любой iterable, а не только множество.
Официальная документация: frozenset.isdisjointfrozenset.issubsetМетод · Проверки
Проверяет, входят ли все элементы в другой набор.
Нюанс. Множество считается подмножеством самого себя.
Официальная документация: frozenset.issubsetfrozenset.issupersetМетод · Проверки
Проверяет, содержит ли множество все элементы другого набора.
Нюанс. Равные множества проходят эту проверку.
Официальная документация: frozenset.issupersetfrozenset.unionМетод · Новые множества
Создаёт объединение элементов.
Нюанс. Метод принимает iterable; оператор объединения требует множества.
Официальная документация: frozenset.unionfrozenset.intersectionМетод · Новые множества
Создаёт множество общих элементов.
Нюанс. Исходное множество неизменно; результат также является frozenset.
Официальная документация: frozenset.intersectionfrozenset.differenceМетод · Новые множества
Создаёт множество элементов, отсутствующих в других наборах.
Нюанс. Порядок операндов меняет результат.
Официальная документация: frozenset.differencefrozenset.symmetric_differenceМетод · Новые множества
Создаёт множество элементов, встречающихся только в одном из двух наборов.
Нюанс. Общие элементы исключаются; метод принимает один другой iterable.
Официальная документация: frozenset.symmetric_differencefrozenset.copyМетод · Копирование
Получает поверхностную копию множества.
Нюанс. Копирование не создаёт глубокие копии объектов-элементов.
Официальная документация: frozenset.copyМетоды и свойства frozendict (Python 3.15)
Шесть методов чтения и создания выведены из официально указанного сходства API dict и frozendict с перечисленными исключениями; непосредственно отдельный новый якорь имеет fromkeys().
frozendict.copyМетод · Копирование
Получает поверхностную копию неизменяемого словаря.
Нюанс. Неизменяемость словаря не делает вложенные значения неизменяемыми.
Официальная документация: frozendict.copyfrozendict.fromkeysМетод · Создание
Создаёт неизменяемый словарь с указанными ключами и общим значением.
Нюанс. Один изменяемый value будет общим для всех ключей; нехешируемое значение лишает frozendict хешируемости.
Официальная документация: frozendict.fromkeysfrozendict.getМетод · Чтение
Возвращает значение ключа или запасное значение.
Нюанс. Запасное значение не добавляет отсутствующий ключ; изменяющего setdefault() у frozendict нет.
Официальная документация: frozendict.getfrozendict.itemsМетод · Перебор
Возвращает представление пар ключ–значение.
Нюанс. Структура словаря неизменна, но сами значения могут быть изменяемыми объектами.
Официальная документация: frozendict.itemsfrozendict.keysМетод · Перебор
Возвращает представление ключей.
Нюанс. Порядок добавления сохраняется; представление можно преобразовать в list.
Официальная документация: frozendict.keysfrozendict.valuesМетод · Перебор
Возвращает представление значений.
Нюанс. Сами значения могут быть изменяемыми; представление не является готовым списком.
Официальная документация: frozendict.valuesПервичные источники главы:
Примеры и материалы с собой
Архив содержит наши самостоятельные примеры, тестовые данные, ожидаемый результат и README. Указанные команды установки и фрагменты REPL отделены от скриптов, которые проверены запуском.
Сверено с официальной документацией 2026-10-12. Стандартная библиотека и сторонние пакеты различаются; ссылки на источники есть в каждой главе.


