# Auther: Aaron Fan"""生成器:只有在调用的时候才会生成相应的数据(调用到这个数据的时候才会生成这个数据,没有调用到时就没有这个数据)只记录数据的当前位置生成器不能像普通的列表同样,经过下标或者切片的方式去取生成器只能经过 循环 或者__next__()(2.x中用next())方法去取。"""# 建立生成器"""# 方法一:generator1 = ( i*i for i in range(10) )for i in generator1: print(i)"""# 生成一个列表,保存一个计算20次的斐波那契数列:# 斐波那契数列:除第一个和第二个数外,任意一个数均可由前两个数相加获得。"""# 普通的方法,用一个函数实现:def fib(max): n, a, b = 0, 0, 1 while n < max: print(b) a, b = b, a + b # 注意,赋值语句a, b = b, a + b # 至关于: # t = (b, a + b) #t是一个tuple(元组) # a = t[0] # b = t[1] n += 1 return 'done'fib(20)"""# 方法二:# 使用生成器,来生成一个斐波那契数列:def fib(max): n, a, b = 0, 0, 1 while n < max: yield b # 注意这里的区别 a, b = b, a + b # 注意,赋值语句a, b = b, a + b # 至关于: # t = (b, a + b) #t是一个tuple(元组) # a = t[0] # b = t[1] n += 1 # 这个函数由于使用了yield,它便不能再称之为函数,而应该称之为生成器 # 而这里的return的返回值,值返回给一个异常状态下的值 # 好比这里当全部数据都生成完成后,没有数据了,会返回这么一个异常:StopIteration: done,这个done是能够自定义的,就是经过下面的这个return return 'done'fib_generator = fib(20)print(fib_generator)print(fib_generator.__next__())print(fib_generator.__next__())print(fib_generator.__next__())print(fib_generator.__next__())print(fib_generator.__next__())print(fib_generator.__next__())print(fib_generator.__next__())print('start fib_generator:')#for i in fib_generator: # 注意:前面由于已经使用next方法,取过几个数据了,因此这里直接从最后一次取值的地方开始循环# print(i)while True: try: fib_value = fib_generator.__next__() print("fib_value: %s" % fib_value) except StopIteration as fibs: print("Generator return value: %s " % fibs.value) break