python - 为什么我的函数抛出 'StopIteration' 异常?

标签 python generator

我有一个函数可以使用生成器计算毕达哥拉斯三元组。但是,当我调用 next(myfunc()) 时,它会抛出此错误:

Traceback (most recent call last):
  File "path omitted", line 124, in <module>
    next(x)
StopIteration

其中 x = myfunc()

这是我的功能:

import math

def myfunc():
    i = 1
    for z in range(0, i):
        for y in range(0, z):
            for x in range(0, y):
                if (math.pow(x, 2) + math.pow(y, 2)) == math.pow(z, 2):
                    yield (x*y*z)
                    i += 1

最佳答案

问题是你的函数没有产生任何结果,因为你的范围可能搞砸了:

  1. z0i - 1 (0) - 所以你只有一个循环 z = 0
  2. y0z - 1 (-1) - 看到问题了吗?<

所以基本上你是在“空”生成器上调用 next,所以你会得到一个 StopIteration 异常。

另请注意,range(0, i) 仅在 i = 1 之后计算一次,因此在您的内部递增 i loop 不影响外层循环的界限,所以它是一个无用的语句。

顺便说一句,大多数时候你不必手动调用 next,你应该使用 for 循环:

for a in myfunc(): # The for loop handle the StopIteration exception for you
    print(a)

编辑: 而且您不应该使用 math.pow 来计算整数的平方值,因为它不准确(浮点精度)而且比比执行 x * x 慢,所以只需检查 x * x + y * y == z * z(或使用 python 幂符号 **: x ** 2 + y ** 2 == z ** 2).

关于python - 为什么我的函数抛出 'StopIteration' 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33672539/

相关文章:

python - 我可以将格式丰富的 Slack 消息作为机器人而不是 Webhook 发送吗?

python - 更新内联表单集时出现 MultiValueDictKeyError

python - 使用 Python 的 elementtree 为带有文本的节点添加书尾

python - 将嵌套的 mongoDB 文档转换为平面 pandas DataFrame(对象数组中的对象数组)

python - 找不到根据键翻译字符串的简单方法

c - 为什么我仍然收到这些错误?

python - 如何在Python中创建嵌套的生成器结构?

python - 创建一个修改了一个元素的新元组

javascript - javascript es6 迭代器惰性求值在内存中如何工作?

javascript - 如何向正在运行的发电机提供数据?