我有一个使用生成器来计算勾股三元组的函数。但是,当我打电话给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
)-看到问题了吗?因此,基本上,您正在调用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
)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句