当下一个方法应该返回两个生成器的值时,如何为类创建下一个方法?

2024-03-29 02:35:16 发布

您现在位置:Python中文网/ 问答频道 /正文

在下面的示例中,类的下一个方法应该返回来自两个生成器的值:

class Test():
    def __next__(self):
        g1, g2 = self._gen1(), self._gen2() 
        return next(g1), next(g2)

    def _gen1(self):
        i = 0
        while True:
            yield i
            i += 2

    def _gen2(self):
        i = 1
        while True:
            yield i
            i += 2

但是,当我为这个类调用next时,值不会递增。你知道吗

>>> t = Test()
>>> next(t)
>>> (0, 1)
>>> next(t)
>>> (0, 1)

怎么了?有没有更雄辩的方法来写这节课?你知道吗


Tags: 方法testselftrue示例returndefclass
2条回答

您的代码不起作用,因为它在每次调用__next__()时都重新创建生成器函数,这将有效地将它们重置回初始状态,然后返回下一个next()值:

    def __next__(self):
        g1, g2 = self._gen1(), self._gen2()  # Don't do this here.
        return next(g1), next(g2)

您可以通过添加__init__()方法并在其中初始化它们来修复此问题:

class Test:
    def __init__(self):
        self.g1, self.g2 = self._gen1(), self._gen2()  # Initialize here.

    def __next__(self):
        return next(self.g1), next(self.g2)
    ...

一种更雄辩、更简洁的方法是使用内置的^{} function来创建一个“生成器迭代器”,每次调用它时,它都会从每个生成器返回一对下一个值,从而避免出现问题。另一个优点是,只需更改__init__()方法,就可以很容易地扩展到处理更多的生成器。你知道吗

我的意思是:

class Test:
    def __init__(self):
        self.generators = zip(self._gen1(), self._gen2())

    def __next__(self):
        return next(self.generators)

    def _gen1(self):
        i = 0
        while True:
            yield i
            i += 2

    def _gen2(self):
        i = 1
        while True:
            yield i
            i += 2

t = Test()
for _ in range(3):
    print(next(t))

输出:

(0, 1)
(2, 3)
(4, 5)

虽然我不知道你想完成什么,但这里有一个清理过的版本(我认为)可以满足你的需要。你知道吗

class Test():
    def __init__(self):
        self.g1 = self._gen2() 
        self.g2 = self._gen1()
    def __next__(self):
        return next(self.g1), next(self.g2)

    def _gen1(self):
        i = 0
        while True:
            yield i
            i += 2

    def _gen2(self):
        i = 1
        while True:
            yield i
            i += 2

t = Test()

print(next(t))           
print(next(t))           
print(next(t))  

相关问题 更多 >