Генератор Python: фильтрация выбросов с изменяемым порогом
Напишите решение на Python и проверьте его на странице.
Другие упражнения по этой теме: Генератор send в Python: задачи на состояние и управление потоком.
Потоковый фильтр давления
Потоковый фильтр следит за числовыми замерами давления и отсекает аномальные всплески. В своей работе он опирается на начальный базовый уровень и текущий порог отсечения.
Когда фильтр принимает числовой замер, он сравнивает его с порогом. Если значение не превышает этот барьер, оно признаётся допустимым, становится новым базовым уровнем и возвращается наружу. Если же замер оказывается строго выше порога, он отбрасывается, а фильтр возвращает текущий базовый уровень.
Входящий поток может содержать не только замеры, но и калибровочные команды с новым порогом. Получив такое указание, фильтр обновляет только величину барьера и сразу возвращает подтверждённое значение этого нового порога. При этом сохранённый базовый уровень остаётся прежним, даже если он оказался выше только что заданного барьера.
Реализуйте сопрограмму фильтра, которая выдаёт подтверждённое либо замещённое число в ответ на замер и подтверждает величину нового барьера при получении настроечной команды.
Что уже дано
В заготовке объявлена функция pressure_filter(initial_baseline, threshold). Вспомогательные функции для проверки протокола уже доступны в среде выполнения, их реализовывать не нужно.
Что нужно сделать
Реализуйте функцию pressure_filter(initial_baseline, threshold).
Функция принимает два аргумента:
initial_baseline— начальный базовый уровень давления (конечное числоintилиfloat, от-1 000 000до1 000 000);threshold— начальный порог отсечения (конечное числоintилиfloat, от-1 000 000до1 000 000). Исходныйinitial_baselineможет быть как меньше либо равенthreshold, так и строго больше него.
Функция возвращает новую неинициализированную однократную сопрограмму (генератор), поддерживающую методы send(), close() и протокол итератора. Каждый вызов pressure_filter создаёт независимый генератор с собственным состоянием.
Правила взаимодействия с сопрограммой:
- Первый запуск (прайминг) выполняется вызовом
next(coro)илиcoro.send(None). При этом первом шаге генератор должен вернутьNone. Передача любого значения, отличного отNone, в неинициализированную сопрограмму вызывает ошибкуTypeError. - После прайминга сопрограмма обрабатывает поток сообщений (от 0 до 1000 сообщений за сессию, сообщения
Noneпосле инициализации не передаются). - Если поступил числовой замер (конечное число
intилиfloatот-1 000 000до1 000 000): - если замер
<= threshold, он становится новым базовым уровнем, и сопрограмма возвращает это число; - если замер
> threshold, базовый уровень не меняется, и сопрограмма возвращает текущий сохранённый базовый уровень. - Если поступила команда калибровки — словарь ровно с одним ключом
"set_threshold", значение которого является числом от-1 000 000до1 000 000: - сопрограмма заменяет текущий порог
thresholdна новое значение; - сопрограмма немедленно возвращает это новое значение порога;
- текущий базовый уровень остаётся без изменений, даже если он оказался строго больше нового порога.
- Вызов
coro.close()завершает работу сопрограммы. Любой последующий вызовnext(coro)возбуждает исключениеStopIteration.
Ввод и вывод
Стандартные потоки stdin и stdout в решении не используются: считывать ввод и печатать через print не требуется. Тестирующая система получает функцию верхнего уровня pressure_filter после выполнения кода ученика и проверяет работу возвращаемых сопрограмм.
Пример использования
coro = pressure_filter(9, 10)
next(coro)
print(coro.send(12))
print(coro.send({'set_threshold': 2}))
print(coro.send(3))
print(coro.send(2))
coro.close()
Вывод:
9 2 9 2
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- Send() до первого next(): ошибка запуска генератора Python
- Генератор с send() на Python: накопление порций и смена лимита
- Учёт трафика через генератор Python: сумма и динамический лимит
- Генератор Python: центрирование данных в скользящем окне
- Генератор с состоянием Python: реализуйте переключатель с гистерезисом
- Send() в Python: накопление импульсов и квантование смещения
