我有一个使用发生器计算毕达哥拉斯三元组的函数.但是,当我调用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)
问题是你的函数没有产生任何东西,因为你的范围可能搞砸了:
z从进入0到i - 1(0) -所以你只有一个循环z = 0y从那张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)
Run Code Online (Sandbox Code Playgroud)
编辑:你不应该使用math.pow来计算一个整数的平方值,因为它是不准确的(浮点精度),这是比做更慢x * x,所以只需选中x * x + y * y == z * z(或使用Python幂符号**:x ** 2 + y ** 2 == z ** 2).
| 归档时间: |
|
| 查看次数: |
250 次 |
| 最近记录: |