如何解决 Python 中的 StopIteration 错误?

Posted

技术标签:

【中文标题】如何解决 Python 中的 StopIteration 错误?【英文标题】:How to solve StopIteration error in Python? 【发布时间】:2018-10-08 17:02:29 【问题描述】:

我刚刚阅读了一堆关于如何在 Python 中处理 StopIteration 错误的帖子,我在解决我的特定示例时遇到了麻烦。我只想用我的代码打印出 1 到 20,但它会打印出错误 StopIteration。我的代码是:(我是这里的新手,所以请不要阻止我。)

def simpleGeneratorFun(n):

    while n<20:
        yield (n)
        n=n+1
    # return [1,2,3]

x = simpleGeneratorFun(1)
while x.__next__() <20:
    print(x.__next__())
    if x.__next__()==10:
        break

【问题讨论】:

【参考方案1】:

任何时候你使用x.__next__(),它都会得到下一个产生的数字——你不会检查每一个产生的数字并且跳过10——所以它会在20之后继续运行并中断。

修复:

def simpleGeneratorFun(n):

    while n<20:
        yield (n)
        n=n+1
    # return [1,2,3]

x = simpleGeneratorFun(1)
while True:
    try:
        val = next(x) # x.__next__() is "private", see @Aran-Frey comment 
        print(val)
        if val == 10:  
            break
    except StopIteration as e:
        print(e)
        break

【讨论】:

请使用next函数而不是__next__ 感谢您的回答和课程。我努力学习。 我尝试了下一个,但它说:“AttributeError: 'generator' object has no attribute 'next'” @BarishAhsen 将代码完全复制到pyfiddle.io - 选择 2.7 或 3.x - 两者都适用。如果它不适合您,请详细说明。你可能抄错了什么。【参考方案2】:

首先,在每次循环迭代中,通过对__next__() 进行 3 次单独调用,您将迭代器推进 3 次,因此 if x.__next__()==10 可能永远不会被命中,因为第 10 个元素可能已被更早地使用。与缺少您的 while 条件相同。

其次,python 中通常有更好的模式,您不需要直接调用next。例如,如果您有有限迭代器,请使用 for 循环在 StopIteration 上自动中断:

x = simpleGeneratorFun(1)
for i in x:
    print i

【讨论】:

感谢您的回答和教训。我记下了你的教程。

以上是关于如何解决 Python 中的 StopIteration 错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 Python 中的 StopIteration 错误?

如何解决 Heroku(Python)中的“应用程序错误”[重复]

如何解决Python中的函数逼近任务?

如何解决 Python 中的开放集分类问题?

形状不匹配:无法将对象广播到单个形状如何解决python中的此类错误?

如何通过 IE11 解决 selenium python 中嵌套 HTML 中的超链接?