嵌套迭代器从它嵌套的方法访问变量

时间:2014-06-10 17:07:32

标签: python python-2.7 iterator

我想创建一个迭代器,在消耗它时计算另一个迭代器的长度。 以下是我想要实现的实例:

from random import random

def randleniter(p):
    while random() < p:
        yield 7

count = 0

def do():
    def countiter(piter):
        global count
        for i in piter:
            count += 1
            yield i
    list(countiter(randiter(0.99))) #simulator for a different method consuming the iterator
    return count

>>> do()
81

但是,如果我打算使用全局变量,我就不会像这样构建它。我想,因为我可以用嵌套方法做到这一点:

def make_adder(x):
    def add(y):
        return x + y
    return add

我能够做到这一点:

def do():
    count = 0
    def countiter(piter):
        for i in piter:
            count += 1
            yield i
    list(countiter(randiter(0.99)))
    return count

但这导致UnboundLocalError: local variable 'count' referenced before assignment。当我print locals()内的countiter时,它不包含count。 我可以以某种方式countiter访问count吗?

1 个答案:

答案 0 :(得分:3)

您所描述的内容称为closure,这是一个完全独立于迭代器和生成器的主题。 Python3.x有nonlocal关键字(只是在countiter中声明nonlocal count以匹配你想要的行为,在python 2.7中,你必须通过可变对象来模拟它(因为内部函数可以{{1} }和read外部函数变量,而不是它们mutate

所以你实际上可以这样做:

assign