如何解决Python中的StopIteration错误?新手代码报错求助
解决Python生成器的StopIteration错误问题
嘿,别担心,新手遇到这种问题太正常了!咱们来一步步拆解你的代码问题所在:
你的代码核心问题
你在while循环里连续调用了三次x.__next__(),这直接导致了两个问题:
- 每次循环会跳过多个数值(比如第一次判断用了1,打印用了2,判断是否等于10用了3,完全打乱了正常的取值逻辑)
- 当生成器耗尽所有可生成的数值后,再调用
__next__()就会触发StopIteration错误——这是生成器的正常结束信号,但你没做任何处理。
另外你的生成器循环条件是n<20,这意味着它最多生成到19,没法输出20哦。
修正后的代码(推荐写法)
用for循环遍历生成器是Python里最简洁且安全的方式,它会自动处理StopIteration,不用手动调用__next__():
def simpleGeneratorFun(n): while n <= 20: # 改成<=20才能生成到20 yield n n = n + 1 x = simpleGeneratorFun(1) for num in x: print(num) if num == 10: break
如果一定要用while循环的写法
如果你想手动控制迭代过程,记得把每次取出的生成器值存到变量里,避免多次调用__next__(),同时捕获StopIteration错误:
def simpleGeneratorFun(n): while n <= 20: yield n n = n + 1 x = simpleGeneratorFun(1) try: while True: num = x.__next__() # 只调用一次,存到变量里复用 print(num) if num == 10: break except StopIteration: # 生成器耗尽时会触发这个异常,我们捕获后直接结束即可 pass
补充说明
生成器是一次性迭代对象,每次调用__next__()都会取下一个值,直到没有值可取时抛出StopIteration。所以绝对不能在一个循环里多次调用它,否则会打乱你的取值逻辑,还容易触发错误~
内容的提问来源于stack exchange,提问作者Barish Ahsen
相关产品推荐
相关产品推荐

