发电机当前值

12
在Python中,我可以这样构建一个生成器:
def gen():
    x = range(0, 100)
    for i in x:
        yield i  

我现在可以使用以下代码定义一个生成器实例:

a = gen()

使用以下方法从生成器中提取新值:

a.next()

但是有没有一种方法a.current()可以获取生成器的当前值?

4个回答

13

没有这样的方法,你也不能为生成器添加属性。一个解决方法是创建一个迭代器对象来包装你的生成器,并包含一个'current'属性。更进一步的做法是将其用作生成器的装饰器。

下面是一个实用的装饰器类:

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

6

您可以设置变量的值。

current_value = a.next()

然后充分利用当前值。Python 在 for 循环语句中经常使用这种方式。

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

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


-2
你可以使用一个滑动窗口生成器,类似于
def _window(i: Iterator[T]) -> Iterator[Tuple[T, Optional[T]]]:
    prev = None
    for x in i:
        if prev:
            yield prev, x
        prev = x
    yield prev, None

i = _window(iter([1,2,3,4]))
print(next(i)) # (1, 2)
print(next(i)) # (2, 3)
print(next(i)) # (3, 4)
print(next(i)) # (4, None)

1
那么如何获取 i 的当前值呢? - mkrieger1
在滑动窗口中,您将生成器转换为返回当前和下一个对而不仅仅是下一个。这样,您可以在每次迭代中操作当前和下一个。 “当前”值取决于迭代,但它是元组中的第一个。即:(tp [0] for tp in i) <=> i。这类似于Scala滑动函数 - CervEd

-2

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

# 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

5
全局变量几乎肯定是一个糟糕的设计。 - Richard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接