Python 用类模拟产量

Python 用类模拟产量,python,python-3.x,generator,yield,Python,Python 3.x,Generator,Yield,我有以下yield功能: def yield_numbers(start=1, end=1e6): num = start while num <= end: yield num num += 1 使用它: for i in YieldNumbers(start=1,end=3): print (i) 1 2 3 >>> y=YieldNumbers() >>> next(y) 1 >&g

我有以下
yield
功能:

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

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
以产量为单位的i的
(开始=1,结束=3):
印刷品(一)
1.
2.
3.
>>>y=产量数字()
>>>下一个(y)
1.
>>>y.关闭()
>>>下一个(y)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第18行,下一步__
停止迭代

这与
yield
的工作原理类似(在最基本的层面上)。如果没有,我在这里错过了什么?再次强调,这并不是要重新发明轮子或使某些东西变得坚固,而是要在概念层面上理解收益率是如何工作的

虽然在您的示例中行为相同,但这与
yield
的工作方式不同。基本上,
yield
暂停生成器函数的执行,并在调用
next
时从同一位置恢复;并且生成器函数开始暂停,因此直到第一次调用
next
时才执行初始代码

将使用
yield
的代码转换为不使用
yield
的代码是可能的,但并非微不足道。为了模拟生成器的工作方式,我们需要实例知道它应该从何处假装“恢复”,所以让我们称之为
resume\u点
。我不关心一些细节,比如将数据发送回生成器、异常处理或关闭;但你明白了

类示例:
定义初始(自我、开始、结束):
self.start=开始
self.end=结束
self.resume_point=0
定义(自我):
回归自我
定义下一个(自我):
如果self.resume_point==0:
#模拟生成器函数的开头
self.num=self.start
#模拟检查“while”循环条件

如果self.num这个问题值得一看:它看起来确实是迭代器协议的一个非常好的实现。也许您可以稍微改进它,使其更为通用,例如,编码一个计数器'n',它在每次调用uuu next uuu时都会增加,uuu next uu,这样,如果'n'大于结束值,您将提高StopIteration,否则您将使用函数生成关联值。对于这个具体的实现,尽管它实际上是完美的,只是澄清一下--“0”表示生成器的开始,“1”表示在活动执行期间,“2”表示它退出时,对吗?在这个示例中,是的,0表示函数的开始,1表示
产量,2表示结束。对于不同的示例,可能有更多的恢复点,通常每个
收益率都有一个恢复点。
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