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

mad*_*mma 1 python generator

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

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

哪里 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
Run Code Online (Sandbox Code Playgroud)

Hol*_*olt 7

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

  1. z从进入0i - 1(0) -所以你只有一个循环z = 0
  2. y从那张0z - 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)
Run Code Online (Sandbox Code Playgroud)

编辑:你不应该使用math.pow来计算一个整数的平方值,因为它是不准确的(浮点精度),这是比做更慢x * x,所以只需选中x * x + y * y == z * z(或使用Python幂符号**:x ** 2 + y ** 2 == z ** 2).