Drone X

Стандартная библиотека: JSON, время, счётчики, случайности

4 блок(ов) теории · 10 заданий · 150 баллов

Стандартная библиотека — это «батарейки в комплекте»: вместе с Python ставятся сотни готовых модулей, и работа программиста чаще в том, чтобы найти подходящий, чем написать свой. Модуль — файл с готовыми функциями; строка import math делает его функции доступными в программе — вы уже подключали math в модуле 3 ради math.sqrt. После подключения функция зовётся через точку: имя модуля, точка, имя функции — math.floor(-2.1) — это -3. Вторая форма — from math import sqrt: она переносит одну функцию из модуля под коротким именем, и дальше она зовётся без точки: sqrt(2.25) — это 1.5. Экономия на точке стоит читаемости: в длинном файле sqrt(...) не видно, откуда функция, а math.sqrt(...) видно сразу, — поэтому в этом курсе в основном пользуются полной формой. Полный официальный каталог модулей называется «The Python Standard Library» и живёт на docs.python.org — у каждого модуля там страница с описанием, сигнатурами и примерами. Читать эту документацию — навык этого модуля: сигнатура json.dumps(obj, sort_keys=False, ...) сообщает, что функция принимает obj и необязательный параметр sort_keys со значением по умолчанию False — то есть по умолчанию ключи не сортируются, и сортировку надо запросить явно.

Главный герой модуля — формат JSON, на котором ходит телеметрия дронов: строка '{"alt": 45.2, "sat": 12}' — это текстовая запись словаря из модуля 5. Модуль json переводит в обе стороны: json.loads(строка) разбирает строку в настоящее значение Python — словарь, список, число; json.dumps(словарь) собирает значение обратно в строку. У dumps много параметров, и один из главных — sort_keys=True: ключи в строке выстраиваются по алфавиту. Без сортировки порядок ключей зависел бы от порядка вставки, и две одинаковые сводки, собранные в разных местах программы, давали бы разные строки; отсортированные строки сравнимы посимвольно — на этом держатся сравнение конфигураций и читаемые логи. Разбор сохраняет типы и вложенность: 12 в JSON даёт int, 45.2 — float, а значением поля может быть другой словарь — loads перенесёт его как есть.

Время миссии считает класс datetime из модуля datetime (модуль и класс названы одинаково, поэтому берут класс: from datetime import datetime). Момент создаётся из метки ISO-формата — datetime.fromisoformat("2026-05-01T12:00:00"): год-месяц-день, буква T, часы:минуты:секунды. Разность двух моментов — это timedelta, длительность; у неё есть total_seconds(), а минуты — те же секунды, делённые на 60. Вычитание работает в любую сторону: перепутанные местами начало и конец миссии дадут отрицательную длительность — честный сигнал о перепутанных метках, а не ошибка.

Частоты событий считает Counter из модуля collections — тот самый частотный словарь, который в модуле 5 собирался циклом: Counter(events) насчитывает каждое значение, а метод most_common(k) отдаёт k самых частых пар «(значение, счёт)» в порядке убывания счёта; при равных счётах раньше идёт то, что впервые встретилось в списке. Пара распаковывается, как кортеж из модуля 3: for name, count in ...; а если счёт не нужен, его место занимает подчёркивание _ — договорённость «это значение мне не нужно», тот же приём, что в цикле for _ in range(n), где важны сами n повторов, а не счётчик.

Случайности даёт random. Для повторяемых сценариев генератор создают с фиксированным зерном: rng = random.Random(42) — и вся последовательность вызовов rng.uniform(a, b) (случайное дробное от a до b) становится детерминированной: одинаковый seed — одинаковый список точек на любой машине. Именно поэтому автотесты могут сверять точные значения «случайных» данных.

Дробные числа в Python хранятся по стандарту IEEE 754: число живёт в памяти как двоичная дробь, и большинство «круглых» десятичных дробей точно не представимо — 0.1 и 0.2 лежат в памяти бесконечными двоичными приближениями. Поэтому 0.1 + 0.2 — это не 0.3, а 0.30000000000000004, и сравнение 0.1 + 0.2 == 0.3 возвращает False. Правильное сравнение float — через допуск: abs(a - b) < eps, где abs — абсолютная величина (модуль числа: abs(-22.2) — это 22.2), а eps — маленький допуск вроде 1e-9; запись 1e-9 означает ноль целых и девять нулей после единицы — 0.000000001. С тем же стандартом связана ловушка округления: round(2.675, 2) даёт 2.67, а не 2.68 — двоичное представление 2.675 чуть меньше настоящего значения (2.674999…), и округление честно уходит вниз. Ещё одна особенность round, о которой стоит знать заранее: при ровно половине он округляет к чётной последней цифре — round(2.5) — это 2, round(3.5) — это 4. Это не баг, а соглашение (банковское округление): при многих округлениях подряд «вверх» и «вниз» половины компенсируют друг друга, и ошибка не накапливается. Форма round(x) без второго аргумента возвращает целое int, форма round(x, n) — float. Всегда вниз округляет math.floor: math.floor(2.9) — это 2, а math.floor(-2.1) — это -3: вниз означает к меньшему, а -3 меньше -2.1.

Задания

0/10 заданий · 0/150 баллов

1. Импорт: две формы и где живёт документация

10 балл(ов)

В модуле 3 вы подключали модуль строкой import math и звали функцию как math.sqrt. Теперь сравните обе формы подключения. Выберите вариант, где верно сказано, как вызвать sqrt после import math и после from math import sqrt, чем формы отличаются — и где находится официальный каталог всех модулей стандартной библиотеки.

1 / 10