Генератор діапазону з плаваючою точкою
Реалізуйте генераторну функцію float_range
, яка працює подібно до вбудованої функції range
, але підтримує дійсні числа (з плаваючою точкою) та повертає значення ліниво (за допомогою yield
). Генератор повинен створювати послідовність чисел від start
до stop
(не включаючи stop
) з кроком step
.
Функція повинна коректно працювати у випадках:
- додатного та від’ємного кроку;
- дробових кроків (наприклад, 0.1);
- граничних випадків, як-от
start >= stop
при додатному кроці;
Сигнатура функції:
def float_range(start: float, stop: float, step: float) -> Iterator[float]:
Приклад
# Приклад 1: Крок додатній, від 1.0 до 2.0 (не включно)
# [1.0, 1.3, 1.6, 1.9]
print(list(float_range(1.0, 2.0, 0.3)))
# Приклад 2: Крок від’ємний, від 5.0 до 3.0 (не включно)
# [5.0, 4.5, 4.0, 3.5]
print(list(float_range(5.0, 3.0, -0.5)))
# Приклад 3: Малий крок 0.1, беремо тільки перші 3 елементи
# Генерує нескінченну кількість чисел, але ми зупиняємося на 3-х перших
print(list(float_range(0.0, 1.0, 0.1))[:3])
# Приклад 4: Початок і кінець однакові — генератор нічого не повертає
print(list(float_range(0.0, 0.0, 1.0))) # []
# Приклад 5: Крок від’ємний, але `start < stop` — умова ніколи не виконається
# Генератор нічого не повертає
print(list(float_range(1.0, 2.0, -1.0))) # []
Підказки до реалізації
- використовуйте цикл while та yield;
- залежно від знаку кроку:
- якщо
step > 0
, зупиняйтесь, колиcurrent >= stop
; - якщо
step < 0
, зупиняйтесь, колиcurrent <= stop
;
- якщо
- уникайте проблем із точністю дійсних чисел — заокруглюйте результат, наприклад, через
round(...)
; - якщо
step == 0
, піднімайте помилкуValueError
.