#python-3.x #iterator #typeerror
#python-3.x #итератор #ошибка типа
Вопрос:
Для упражнения по изучению Python я попытался создать итератор float_range(), который имитирует range(), но допускает значения с плавающей точкой. Я пытаюсь уловить неправильные числа аргументов, чтобы вызвать ошибку типа, и написал функцию ниже.
def float_range(*args):
start = 0.0
step = 1.0
if len(args) == 3:
start, end, step = args
elif len(args) == 2:
start, end = args
elif len(args) == 1:
(end,) = args
else:
raise TypeError()
n = start
if start < end:
if step > 0:
while n < end:
yield n
n = step
else:
if step < 0:
while n > end:
yield n
n = step
Теперь я не понимаю, почему for n in float_range(1,2,3,4): print(n)
и for n in float_range(): print(n)
вызывает ошибку типа, но float_range()
и float_range(1,2,3,4)
этого не делают.
Комментарии:
1. Вы пробовали использовать отладчик для пошагового выполнения кода, чтобы посмотреть, что происходит в каждом конкретном случае?
Ответ №1:
Если вы используете yield
ключевое слово в своей функции, функция вернет генератор:
print(float_range())
<generator object float_range at 0x7fe714bc2f20>
Это не возвращает ошибку, потому что вы еще не выполнили итерацию по ней. В первый раз, когда for
вызовет ваш объект генератора, созданный из вашей функции, он будет запускать код в вашей функции с самого начала, пока не попадет yield
.
В вашем случае у вас нет никаких параметров, поэтому TypeError
генерируется исключение.