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