我有一个使用发生器计算毕达哥拉斯三元组的函数。但是,当我调用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
答案 0 :(得分:7)
问题是你的功能没有产生任何结果,因为你的范围可能搞砸了:
z
从0
转到i - 1
(0
) - 所以你只有一个循环z = 0
y
从0
转到z - 1
(-1
) - 看到问题了?所以基本上你在&#34;空&#34;上打电话给next
。生成器,因此您得到StopIteration
例外。
另请注意,range(0, i)
仅在i = 1
后评估一次,因此在内循环中递增i
不会影响外循环的界限,因此它是无用的言。
BTW,大部分时间你不必手动调用next
,你应该使用for
循环:
for a in myfunc(): # The for loop handle the StopIteration exception for you
print(a)
编辑并且您不应该使用math.pow
来计算整数的平方值,因为它不准确(浮点精度)并且比执行{{慢}慢得多1}},所以只需检查x * x
(或使用python power notation x * x + y * y == z * z
:**
)。