Перейти к содержимому
Поиск
Разработка

Python: полный мануал с примерами и справочником функций

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

Александр Некрасов
Python: практический мануал с кодом, папкой и схемой работы

Python удобно изучать на задачах: посчитать расходы, разобрать текст, прочитать файл, собрать отчёт. В этом руководстве пройдём путь от установки и первых выражений до функций, классов, сети, тестов и самостоятельных проектов.

Выберите одну из 25 глав или найдите нужную функцию через поиск. В справочнике собраны все 73 позиции официальной таблицы встроенных функций и типов Python 3.15, а также 161 метод и 12 свойств строк, коллекций и путей. Для каждой позиции есть назначение, важный нюанс и ссылка на первичную документацию.

Код можно копировать и скачивать. 195 самостоятельных примеров проверены запуском на Python 3.15.0; у упражнений есть решения и ожидаемый результат. Новые возможности языка отмечены в тексте, а интерактивные фрагменты и команды установки объяснены отдельно.

Если начинаете с нуля, открывайте главы по порядку. Если решаете конкретную задачу, ищите по-русски или по имени Python: open, str.split, Path.read_text.

Python 3.15.025 главПримеры проверены запуском
Все главы руководства 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.clear
dict.copyМетод · Копирование

Создаёт поверхностную копию словаря.

Нюанс. Вложенные изменяемые значения остаются общими.

Официальная документация: dict.copy
dict.fromkeysМетод · Создание

Создаёт словарь с указанными ключами и одним начальным значением.

Нюанс. Один изменяемый value будет общим для всех ключей.

Официальная документация: dict.fromkeys
dict.getМетод · Чтение

Возвращает значение ключа или запасное значение.

Нюанс. Не добавляет отсутствующий ключ, в отличие от setdefault().

Официальная документация: dict.get
dict.itemsМетод · Перебор

Возвращает представление пар ключ–значение.

Нюанс. Представление отражает изменения словаря; менять размер словаря во время обхода нельзя.

Официальная документация: dict.items
dict.keysМетод · Перебор

Возвращает представление ключей.

Нюанс. Это динамическое представление; для снимка используют list(d.keys()).

Официальная документация: dict.keys
dict.popМетод · Изменение

Удаляет ключ и возвращает его значение.

Нюанс. Отсутствующий ключ вызывает KeyError, если default не указан.

Официальная документация: dict.pop
dict.popitemМетод · Изменение

Удаляет и возвращает последнюю добавленную пару.

Нюанс. Порядок LIFO гарантирован; пустой словарь вызывает KeyError.

Официальная документация: dict.popitem
dict.setdefaultМетод · Изменение

Возвращает значение ключа и при отсутствии добавляет default.

Нюанс. Выражение default вычисляется заранее даже тогда, когда ключ существует.

Официальная документация: dict.setdefault
dict.updateМетод · Изменение

Добавляет пары и перезаписывает совпадающие ключи.

Нюанс. Изменяет словарь и возвращает None; не создаёт результирующий словарь.

Официальная документация: dict.update
dict.valuesМетод · Перебор

Возвращает представление значений.

Нюанс. Это динамическое представление; равенство двух представлений values не сравнивает наборы значений.

Официальная документация: dict.values

Методы и свойства set

Все 17 публичных методов с отдельными сигнатурами set.*.

set.isdisjointМетод · Проверки

Проверяет отсутствие общих элементов.

Нюанс. Метод принимает любой iterable, а не только множество.

Официальная документация: set.isdisjoint
set.issubsetМетод · Проверки

Проверяет, входят ли все элементы в другой набор.

Нюанс. Множество считается подмножеством самого себя.

Официальная документация: set.issubset
set.issupersetМетод · Проверки

Проверяет, содержит ли множество все элементы другого набора.

Нюанс. Равные множества проходят эту проверку.

Официальная документация: set.issuperset
set.unionМетод · Новые множества

Создаёт объединение элементов.

Нюанс. Метод принимает iterable; оператор объединения требует множества.

Официальная документация: set.union
set.intersectionМетод · Новые множества

Создаёт множество общих элементов.

Нюанс. Не изменяет исходный набор, в отличие от intersection_update().

Официальная документация: set.intersection
set.differenceМетод · Новые множества

Создаёт множество элементов, отсутствующих в других наборах.

Нюанс. Порядок операндов меняет результат.

Официальная документация: set.difference
set.symmetric_differenceМетод · Новые множества

Создаёт множество элементов, встречающихся только в одном из двух наборов.

Нюанс. Общие элементы исключаются; метод принимает один другой iterable.

Официальная документация: set.symmetric_difference
set.copyМетод · Копирование

Получает поверхностную копию множества.

Нюанс. Копирование не создаёт глубокие копии объектов-элементов.

Официальная документация: set.copy
set.updateМетод · Изменение

Добавляет элементы из одного или нескольких iterable.

Нюанс. Изменяет множество и возвращает None.

Официальная документация: set.update
set.intersection_updateМетод · Изменение

Оставляет в множестве только общие элементы.

Нюанс. Изменяет исходный объект и возвращает None.

Официальная документация: set.intersection_update
set.difference_updateМетод · Изменение

Удаляет элементы, встречающиеся в других наборах.

Нюанс. Изменяет исходный объект и возвращает None.

Официальная документация: set.difference_update
set.symmetric_difference_updateМетод · Изменение

Заменяет множество симметрической разностью.

Нюанс. Принимает один другой iterable и меняет исходный объект.

Официальная документация: set.symmetric_difference_update
set.addМетод · Изменение

Добавляет один элемент в множество.

Нюанс. Элемент должен быть хешируемым; повторное добавление не создаёт дубликат.

Официальная документация: set.add
set.removeМетод · Изменение

Удаляет заданный элемент.

Нюанс. Отсутствующий элемент вызывает KeyError.

Официальная документация: set.remove
set.discardМетод · Изменение

Удаляет элемент, если он присутствует.

Нюанс. Отсутствующий элемент не вызывает исключение.

Официальная документация: set.discard
set.popМетод · Изменение

Удаляет и возвращает произвольный элемент.

Нюанс. Выбирать по порядку добавления нельзя; пустое множество вызывает KeyError.

Официальная документация: set.pop
set.clearМетод · Изменение

Удаляет все элементы множества.

Нюанс. Возвращает None и сохраняет сам объект.

Официальная документация: set.clear

Методы и свойства frozenset

Все 8 публичных методов frozenset; изменяющих методов нет.

frozenset.isdisjointМетод · Проверки

Проверяет отсутствие общих элементов.

Нюанс. Метод принимает любой iterable, а не только множество.

Официальная документация: frozenset.isdisjoint
frozenset.issubsetМетод · Проверки

Проверяет, входят ли все элементы в другой набор.

Нюанс. Множество считается подмножеством самого себя.

Официальная документация: frozenset.issubset
frozenset.issupersetМетод · Проверки

Проверяет, содержит ли множество все элементы другого набора.

Нюанс. Равные множества проходят эту проверку.

Официальная документация: frozenset.issuperset
frozenset.unionМетод · Новые множества

Создаёт объединение элементов.

Нюанс. Метод принимает iterable; оператор объединения требует множества.

Официальная документация: frozenset.union
frozenset.intersectionМетод · Новые множества

Создаёт множество общих элементов.

Нюанс. Исходное множество неизменно; результат также является frozenset.

Официальная документация: frozenset.intersection
frozenset.differenceМетод · Новые множества

Создаёт множество элементов, отсутствующих в других наборах.

Нюанс. Порядок операндов меняет результат.

Официальная документация: frozenset.difference
frozenset.symmetric_differenceМетод · Новые множества

Создаёт множество элементов, встречающихся только в одном из двух наборов.

Нюанс. Общие элементы исключаются; метод принимает один другой iterable.

Официальная документация: frozenset.symmetric_difference
frozenset.copyМетод · Копирование

Получает поверхностную копию множества.

Нюанс. Копирование не создаёт глубокие копии объектов-элементов.

Официальная документация: frozenset.copy

Методы и свойства frozendict (Python 3.15)

Шесть методов чтения и создания выведены из официально указанного сходства API dict и frozendict с перечисленными исключениями; непосредственно отдельный новый якорь имеет fromkeys().

frozendict.copyМетод · Копирование

Получает поверхностную копию неизменяемого словаря.

Нюанс. Неизменяемость словаря не делает вложенные значения неизменяемыми.

Официальная документация: frozendict.copy
frozendict.fromkeysМетод · Создание

Создаёт неизменяемый словарь с указанными ключами и общим значением.

Нюанс. Один изменяемый value будет общим для всех ключей; нехешируемое значение лишает frozendict хешируемости.

Официальная документация: frozendict.fromkeys
frozendict.getМетод · Чтение

Возвращает значение ключа или запасное значение.

Нюанс. Запасное значение не добавляет отсутствующий ключ; изменяющего setdefault() у frozendict нет.

Официальная документация: frozendict.get
frozendict.itemsМетод · Перебор

Возвращает представление пар ключ–значение.

Нюанс. Структура словаря неизменна, но сами значения могут быть изменяемыми объектами.

Официальная документация: frozendict.items
frozendict.keysМетод · Перебор

Возвращает представление ключей.

Нюанс. Порядок добавления сохраняется; представление можно преобразовать в list.

Официальная документация: frozendict.keys
frozendict.valuesМетод · Перебор

Возвращает представление значений.

Нюанс. Сами значения могут быть изменяемыми; представление не является готовым списком.

Официальная документация: frozendict.values

Примеры и материалы с собой

Архив содержит наши самостоятельные примеры, тестовые данные, ожидаемый результат и README. Указанные команды установки и фрагменты REPL отделены от скриптов, которые проверены запуском.

Сверено с официальной документацией 2026-10-12. Стандартная библиотека и сторонние пакеты различаются; ссылки на источники есть в каждой главе.