- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个函数可以使用生成器计算毕达哥拉斯三元组。但是,当我调用 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
loop 不影响外层循环的界限,所以它是一个无用的语句。
顺便说一句,大多数时候你不必手动调用 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
).
关于python - 为什么我的函数抛出 'StopIteration' 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33672539/
我正在编写从 azure DevOps 下载大型审计日志 csv 文件并根据给定条件过滤数据的脚本。这适用于小 csv 文件,但对于具有大数据的文件,它会失败 字段 = 下一个(读者) 停止迭代 有人
这是我的代码 class A: pass def f(): yield A() def g(): it = f() next(it).a = next(it, None
以下是 Jean 对我的问题的回答:Python converting strings in a list to numbers ,运行下面的最小代码时出现 StopIteration 异常。 pri
我正在 Python 中实现一个迭代器,它包装另一个迭代器,并在传递迭代器的输出之前对其输出进行后处理。下面是一个简单的示例,它采用一个返回字符串的迭代器,并在每个字符串前面添加 FILTERED B
看看这个,问题的症结在最下面: >>> scan = iter('FHUR203459') >>> while True: print(next(scan)) F H U R 2 0
我想编写一个生成器,它可以接受来自产量的有限数量的输入,然后优雅地处理更多输入。捕获 StopIteration 的最佳方法是什么? 我尝试使用内部生成器与外部生成器进行包装,使用 try- exce
为什么这段代码抛出“StopIteration”: stub_generator = (x for x in range(5)) stub_dict = {} stub_dict[next(stub_
我有一个生成器,我想确认它已经结束(在程序的某个点。我在 python 2.7 中使用 unittest # it is a generator whould have only one item i
为什么多次调用耗尽的生成器时,StopIteration 每次都会引发,而不是仅在第一次尝试时引发?后续调用不是没有意义,并表明调用方代码中可能存在错误吗? def gen_func(): y
当迭代器耗尽时,最后一次从迭代器返回某些东西的好方法是什么。我正在使用一个标志,但这相当丑陋: class Example(): def __iter__(self): sel
我想从一个 csv 文件中读取最多 20 行: rows = [csvreader.next() for i in range(20)] 如果文件有 20 行或更多行则工作正常,否则会失败并出现 St
灵感来自 my own answer ,我什至不明白它是如何工作的,请考虑以下内容: def has22(nums): it = iter(nums) return any(x ==
我有一个 generator检查列表中某个条件的对象。这个程序适用于我的所有情况。 但我只想澄清一些关键点。 在我的程序中每当generator yield值 'No'或 'Done'控制迭代停止并调
我需要捕获 next(it) 抛出的异常,因此在这种情况下我无法使用常规的 for 循环。所以我写了这段代码: it = iter(xrange(5)) while True: try:
我的作业代码遇到了一些问题,我应该浏览一个文本文件并找到四月份的生日并打印它们。文本文件如下所示: 鲍勃,6 月 10 日 乔,4 月 12 日 苏,7 月 22 日 我应该检查一下并打印出四月份的姓
我正在使用 yield from,但我不知道 while 对 yield 的影响。如果我将 yield from 放入 while 循环中,效果很好,但是当我同时取消循环时,会发生异常。 final_
我想遍历两个不同大小的列表,但速度不同(我只找到了并行迭代的答案)。例如,考虑两个包含相同类型元素的排序列表,我想根据它们只在一个列表或两个列表中的事实对元素执行某些操作,使用两个列表的公共(publ
我正在编写一个从文件接收输入的程序,每一行都可能包含“ATG”或“GTG”,我很确定我所做的一切都是我想做的。这是我第一次在 python 中使用生成器,在研究了这个问题之后,我仍然不知道为什么我会停
我有一个函数可以使用生成器计算毕达哥拉斯三元组。但是,当我调用 next(myfunc()) 时,它会抛出此错误: Traceback (most recent call last): File
如果我有多个可迭代对象作为参数,有没有办法让代码在列表之一引发 StopIteration 之后继续运行? 我不能使用任何切片、len() 或任何 itertools。 这是我迄今为止尝试过的方法,我
我是一名优秀的程序员,十分优秀!