我具有以下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
的工作方式(在最基本的水平上类似)相似。如果没有,我在这里想念什么?再说一次,这不是为了重新发明轮子或使某些东西变得坚固,而是要了解收益在概念上是如何工作的。
尽管示例中的行为相同,但这与yield
的工作方式不同。从根本上讲,yield
暂停生成器功能的执行,并在调用next
时从同一位置恢复;以及生成器功能begins paused