用一个类模拟产量

问题描述 投票:1回答:1

我具有以下yield功能:

def yield_numbers(start=1, end=1e6):
    num = start
    while num <= end:
        yield num
        num += 1

我想构建一个类来复制yield表达式的最基本功能,以了解其工作原理。这是我到目前为止的内容:

class YieldNumbers:
    def __init__(self, start=1, end=1e6):
        self.start = int(start)
        self.end = int(end)
        self._current_val = None
        self._closed = False
    def __iter__(self):
        if self._closed: raise StopIteration
        return self
    def close(self):
        self._closed = True
    def send(self, value):
        return self.__next__(value)
    def throw(self, exc_type):
        assert isinstance(exc_type, Exception)
        return self.__next__(exc_type=exc_type)
    def __next__(self, value=None, exc_type=None):
        if self._closed: raise StopIteration
        if exc_type: raise exc_type
        self._current_val = value if value else self.start if not self._current_val else self._current_val + 1
        if self._current_val > self.end: self._closed=True; raise StopIteration
        return self._current_val

并使用它:

for i in YieldNumbers(start=1,end=3):
    print (i)
1
2 
3
>>> y=YieldNumbers()
>>> next(y)
1
>>> y.close()
>>> next(y)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 18, in __next__
StopIteration

这与yield的工作方式(在最基本的水平上类似)相似。如果没有,我在这里想念什么?再说一次,这不是为了重新发明轮子或使某些东西变得坚固,而是要了解收益在概念上是如何工作的。

python python-3.x generator yield
1个回答
0
投票

尽管示例中的行为相同,但这与yield的工作方式不同。从根本上讲,yield暂停生成器功能的执行,并在调用next时从同一位置恢复;以及生成器功能begins paused

© www.soinside.com 2019 - 2024. All rights reserved.