Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在异常后继续迭代?_Python_Python 2.7_Iterator - Fatal编程技术网

Python 如何在异常后继续迭代?

Python 如何在异常后继续迭代?,python,python-2.7,iterator,Python,Python 2.7,Iterator,我对Python-2迭代器和异常之间的交互感到困惑 具体而言,鉴于以下代码: def gen_int(): if not hasattr(gen_int,"x"): gen_int.x = 0 while True: gen_int.x += 1 yield gen_int.x def gen_odd(): for x in gen_int(): if x % 2: yield x

我对Python-2迭代器和异常之间的交互感到困惑

具体而言,鉴于以下代码:

def gen_int():
    if not hasattr(gen_int,"x"):
        gen_int.x = 0
    while True:
        gen_int.x += 1
        yield gen_int.x

def gen_odd():
    for x in gen_int():
        if x % 2:
            yield x
        else:
            raise ValueError("gen_odd",x)
(请假设上述情况超出我的控制!),我写道

希望恢复由
gen\u int
生成的完整流

但是,迭代在第一个异常之后停止:

def gen_test(top):
    for x in gen_all():
        print x
        if x > top:
            break
以下是3个调用:

>>> gen_test(20)
1
('gen_odd', 2)
2
>>> gen_test(20)
3
('gen_odd', 4)
4
>>> gen_test(20)
5
('gen_odd', 6)
6
问题是: 如何修改
genu-all
,以便
genu-test
将打印
top
下面的所有整数?

显然,
gen_odd
中的异常作为
return
——它将迭代器标记为耗尽。真的是这样吗?是否有解决方法?

块中重新分配
gen_odd()
,但
块除外:

def gen_all():
    it = gen_odd()
    while True:
        try:
            yield it.next()
        except ValueError as exn:
            print exn
            func_name, x = exn
            assert func_name == "gen_odd"
            yield x
            it = gen_odd() # here
一旦出现
ValueError
异常,发电机功能停止。在前一个gen function对象停止后,必须调用该函数才能创建另一个gen function对象
gen_odd
从停止的位置拾取,因为从
gen_int
生成的值绑定到函数对象;状态被保存,否则这将不起作用



您可以在try/中使用pass或continueexcept@tinySandy:你能说得更具体一点吗?你为什么在
gen\u odd
中首先提出一个
ValueError
?@Chris\u Rands:正如我所说,
gen\u odd
是我无法控制的
gen\u int
是一个奇怪的生成器。它保存每个新实例使用的全局状态。野外的其他99.99%的生成器不是这样工作的。这是一个很好的答案,但它只起作用,因为
gen_int
是在单个
gen_int.x
上工作的,这意味着它正在生成器外部保存状态。这对大多数引发异常的生成器都不起作用。@tdelaney是的,我认为生成的值是绑定到函数对象的,否则会非常不同,可能会更困难
def gen_all():
    it = gen_odd()
    while True:
        try:
            yield it.next()
        except ValueError as exn:
            print exn
            func_name, x = exn
            assert func_name == "gen_odd"
            yield x
            it = gen_odd() # here
>>> gen_test(5)
1
('gen_odd', 2)
2
3
('gen_odd', 4)
4
5
('gen_odd', 6)
6