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))
|
|||
|
|