Почему не возникает ошибка типа при вызове функции-итератора без итерации?

#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 генерируется исключение.