Генератор діапазону з плаваючою точкою
Реалізуйте генераторну функцію 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.