#斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、34、… import time # def fib(times): # a = 0 # b = 1 # n = 1 # while n<=times: # print(b) # a,b = b,a+b # n+=1 # fib(7) #生成器写法 def fib(times): a = 0 b = 1 n = 1 while n<=times: # print(b) yield b #保存信息状态 time.sleep(1) a,b = b,a+b n+=1 return 'done' #没什么作用,但是当抛出StopIteration异常的时候会返回return内容 F=fib(7)#生成器,调用一次返回一个值;而不是像普通函数那样去调用def fib()函数 # for i in F: # print(i) ''' yield的作用就把一个函数变成一个生成器,带有yield的函数不再是一个普通 函数,python解释器会将其视为一个generator,调用fib(7)不会执行fib函数 而是返回一个迭代器对象!在for循环执行时,每次循环都会执行fib函数内部的代码, 执行到yield b时,fib函数就返回一个值。下次再调用的时候,其它代码接着由中断 位置接着执行 ''' # 获取生成器函数返回值,用捕获StopIteration异常,for。。in。。永远不会出现异常,所以用while True while True: try: print(next(F)) except StopIteration as e: print(e.value) break #所以需要返回值的时候可以如此操作 #总结: ''' 生成器它能够记住上一次返回时函数体中的位置。对生成器函数的第二次(或第n次) 调用跳转至函数中间yield处,而上次调用的所有的局部变量都保持不变。 生成器不仅“记住”数据状态,还记住它在流控制构造中的位置。 生成器的特点: 1、节约内存。 2、保存(上一次)状态。 '''
/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/apple/PycharmProjects/stage4/coroutine/generator_fib.py
1
1
2
3
5
8
13
done
Process finished with exit code 0