为什么我的功能会抛出一个' StopIteration'例外?

时间:2015-11-12 13:28:32

标签: 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 个答案:

答案 0 :(得分:7)

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

  1. z0转到i - 10) - 所以你只有一个循环z = 0
  2. y0转到z - 1-1) - 看到问题了?
  3. 所以基本上你在&#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**)。