【问题标题】:Why is no TypeError raised when iterator function is called without iterating?为什么在没有迭代的情况下调用迭代器函数时没有引发 TypeError?
【发布时间】:2020-09-11 08:10:20
【问题描述】:

对于学习 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,2,3,4) 不会。

【问题讨论】:

  • 您是否尝试过使用调试器单步执行代码以查看每种情况下会发生什么?

标签: python-3.x iterator typeerror


【解决方案1】:

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

print(float_range())

<generator object float_range at 0x7fe714bc2f20>

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

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

【讨论】:

    猜你喜欢
    • 2021-01-10
    • 2015-01-27
    • 2013-02-28
    • 2014-09-18
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 2012-11-24
    • 2021-05-13
    相关资源
    最近更新 更多