Генераторы и итераторы · 7 из 16
Пульсы печи
В ночную смену на хлебозаводе меняют плату управления печью. Плата берёт из программы поток значений, по одному на каждый такт: заслонка ходит меандром — открыто или закрыто, лента конвейера — пилой, медленно вперёд и разом назад, вентилятор — треугольником. Пока новую плату не привезли, наладчик проверяет программу на стенде, и ему нужен источник таких сигналов — бесконечный, по значению на такт.
Что сделать
Напишите генератор, который бесконечно выдаёт сигнал нужного вида — пилу, меандр или треугольник — по значению на такт.
Что приходит
vid— вид сигнала:"pila","meandr"или"treugolnik"period— через сколько тактов сигнал повторяетсяamplituda— наибольшее значение сигнала
Что вернуть
Генератор: каждый next даёт значение следующего такта, округлённое до тысячных, — и так без конца.
Допишите функцию signal в редакторе справа.
Результат верните через return — то, что
напечатано, на проверку не влияет.
с графикой когда тесты пройдут, ответ вашей функции нарисуется · все задачи с графикой
Пила с периодом 4 и амплитудой 8 растёт на четверть амплитуды за такт и обрывается в ноль: 0, 2, 4, 6, 0, 2, 4, 6… Десять первых значений — [0.0, 2.0, 4.0, 6.0, 0.0, 2.0, 4.0, 6.0, 0.0, 2.0].
g = signal("pila", 4, 8)
[next(g) for _ in range(10)]
[0.0, 2.0, 4.0, 6.0, 0.0, 2.0, 4.0, 6.0, 0.0, 2.0]
Такты нумеруются с нуля; k — номер такта внутри периода, k = i % period.
- pila: amplituda · k / period;
- meandr: amplituda, пока 2 · k < period, иначе 0 — первая половина периода вверху; при нечётном периоде вверху на такт больше: при периоде 5 условие 2 · k < 5 верно для k = 0, 1, 2;
- treugolnik: при 2 · k ≤ period — 2 · amplituda · k / period, иначе 2 · amplituda · (period − k) / period. Каждое значение — round(…, 3). Генератор не кончается никогда, поэтому список из него не собрать — берут сколько нужно, next или islice. Два генератора, созданные отдельно, идут каждый со своего нуля. period — целое от 1, vid — один из трёх.
Обсуждение
Вопросов пока нет.
Войдите, чтобы спросить.