发电机的当前值

时间:2014-02-14 23:15:21

标签: python

在Python中,我可以像这样构建一个生成器:

def gen():
  x=range(0,100)
  for i in x:
    yield i  

我现在可以使用以下方法定义生成器的实例:

a=gen()

使用

从生成器中提取新值
a.next()

但是有没有办法--- a.current() ---来获取发电机的当前值?

3 个答案:

答案 0 :(得分:8)

没有这样的方法,您无法向生成器添加属性。解决方法是创建一个包装生成器的迭代器对象,并包含一个“当前”属性。另外一步是将它用作发电机上的装饰器。

这是一个实用程序装饰器类,它可以做到:

class with_current(object):

    def __init__(self, generator):
        self.__gen = generator()

    def __iter__(self):
        return self

    def __next__(self):
        self.current = next(self.__gen)
        return self.current

    def __call__(self):
        return self

然后您可以像这样使用它:

@with_current
def gen():
    x=range(0,100)
    for i in x:
        yield i

a = gen()

print(next(a))
print(next(a))
print(a.current)

输出:

0
1
1

答案 1 :(得分:5)

您可以设置变量的值。

current_value = a.next()

然后使用current_value获取所有值。 Python经常在for语句中使用它

a = xrange(10)
for x in a:
    print(x)

在这里,您将x定义为a的当前值。

答案 2 :(得分:0)

使用另一个全局变量存储当前值可能是可行的。

# Variable that store the current value of the generator
generator_current_val = None

def generator():
    global generator_current_val # to set the current value

    for i in range(10):
        generator_current_val = i
        yield i

a = generator()

print(next(a)) # 0
print(next(a)) # 1
print(next(a)) # 2
print(generator_current_val) # 2
print(next(a)) # 3