在不进行迭代的情况下调用迭代器函数时,为什么不会引发TypeError?

问题描述

为了学习Python,我尝试制作一个float_range()迭代器,该迭代器模仿range()但允许浮点数。我尝试捕获错误数量的参数以引发TypeError并在下面编写了函数

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)引发TypeError,而float_range()float_range(1,4)却没有。

解决方法

如果在函数中使用yield关键字,该函数将返回一个生成器:

print(float_range())

<generator object float_range at 0x7fe714bc2f20>

它不会返回错误,因为您尚未对其进行迭代。 for第一次调用从函数创建的生成器对象时,它将从头开始运行函数中的代码,直到命中yield

在您的情况下,您没有任何参数,因此引发了TypeError异常。