39 lines
1.4 KiB
Python
39 lines
1.4 KiB
Python
from collections import deque
|
||
|
||
if __name__ == "__main__":
|
||
# 在学到了生成器函数以后,有一个巨大陷阱那就是尝试用生成器函数解决一切问题
|
||
# 当生成器函数需要与外界交互的时候,就会让它非常复杂
|
||
# 所以生成器我们就让它安心生成,在需要记录或者与外界交互的时候,写一个生成器类
|
||
class FbbIterClass:
|
||
def __init__(self,nums, history_len=3):
|
||
self.nums = nums
|
||
self.history = deque(maxlen=history_len)
|
||
|
||
def __iter__(self):
|
||
a0, a1 = 1, 1
|
||
index = 0
|
||
while index < self.nums:
|
||
self.history.append(a0)
|
||
yield a0
|
||
a0, a1 = a1, a0 + a1
|
||
index += 1
|
||
|
||
fbbs = FbbIterClass(5)
|
||
|
||
# 先用生成器生成,结果在生成的过程中会存入历史队列
|
||
for i in fbbs:
|
||
print(i)
|
||
|
||
# 当然,在使用for之外的方法进行迭代时,需要额外套一层iter来转发请求到__iter__()
|
||
fbb_iter = iter(fbbs)
|
||
print(fbb_iter.__next__())
|
||
print(fbb_iter.__next__())
|
||
print(fbb_iter.__next__())
|
||
print(fbb_iter.__next__())
|
||
print(fbb_iter.__next__())
|
||
|
||
# 这种方法的好处是,可以在迭代时随时暴露一些东西给外部程序,比如属性和状态
|
||
for line in fbbs.history:
|
||
print("history{}".format(line))
|
||
|