为什么我的函数抛出 'StopIteration' 异常?
Why is my function throwing a 'StopIteration' exception?
我有一个函数可以使用生成器计算毕达哥拉斯三元组。但是,当我调用 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
问题是你的函数没有产生任何结果,因为你的范围可能乱七八糟:
z
从 0
到 i - 1
(0
) - 所以你只有一个循环 z = 0
y
从 0
变为 z - 1
(-1
) - 看到问题了吗?
所以基本上你是在 "empty" 生成器上调用 next
,所以你会得到一个 StopIteration
异常。
另请注意 range(0, i)
仅在 i = 1
之后评估一次,因此在您的内部循环中递增 i
不会影响您的外部循环的边界,因此它是一个无用的声明。
顺便说一句,大多数时候你不必手动调用 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
)。
我有一个函数可以使用生成器计算毕达哥拉斯三元组。但是,当我调用 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
问题是你的函数没有产生任何结果,因为你的范围可能乱七八糟:
z
从0
到i - 1
(0
) - 所以你只有一个循环z = 0
y
从0
变为z - 1
(-1
) - 看到问题了吗?
所以基本上你是在 "empty" 生成器上调用 next
,所以你会得到一个 StopIteration
异常。
另请注意 range(0, i)
仅在 i = 1
之后评估一次,因此在您的内部循环中递增 i
不会影响您的外部循环的边界,因此它是一个无用的声明。
顺便说一句,大多数时候你不必手动调用 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
)。