# 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
时间: 2024-10-22 16:34:47