我想创建一个迭代器,在消耗它时计算另一个迭代器的长度。 以下是我想要实现的实例:
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
吗?
答案 0 :(得分:3)
您所描述的内容称为closure
,这是一个完全独立于迭代器和生成器的主题。
Python3.x有nonlocal
关键字(只是在countiter中声明nonlocal count
以匹配你想要的行为,在python 2.7中,你必须通过可变对象来模拟它(因为内部函数可以{{1} }和read
外部函数变量,而不是它们mutate
。
所以你实际上可以这样做:
assign