生成器的好处:缓解内存压力python
# -*-coding:utf-8 -*- __date__ = '2018/3/9 ' __author__ = 'xiaojiaxin' __file_name__ = '生成器' # a1=[x for x in range(5000000000)] #将range(5000000000)所有扔进内存,速度很是慢,甚至会死机
a=(x for x in range(5)) print(a) # <generator object <genexpr> at 0x0000003FB1622990> #a变成生成器的对象,值不在a里面,把range(10)比喻成10道菜,a是厨师,a一次只作一道菜到内存
#调用数据 print(next(a)) # 内置方法,python3通用方法 # 0 print(next(a)) # 1 print(next(a)) # 2 print(a.__next__()) #内部方法 # 3 print(next(a)) # 4 #print(next(a)) # Traceback (most recent call last): # File "C:/Users/xiaojiaxin/PycharmProjects/fullstack1/week2/day9/生成器.py", line 25, in <module> # print(next(a)) # StopIteration
a=(x*x for x in range(5)) #生成器就是一个可迭代对象 for i in a: #for循环对x内部进行了next()调用 print(i) # 0 # 1 # 4 # 9 # 16
#生成器一共有两种建立方式:1:() 2.yield关键字 def foo1(): print("foo1") return 1 print(foo1) # <function foo1 at 0x000000CAEBECD158> print(foo1()) #执行函数 # foo1 # 1 def foo(): print("ok11") yield 1 print("ok22") yield 2 print(foo) # <function foo at 0x000000CBE62E2E18> g=foo() print(g) #不执行函数 # <generator object foo at 0x000000CBE8002990> #执行生成器 next(g) # ok11 next(g) # ok22 #next(g)#报错 for i in foo(): print(i) # ok11 # 1 # ok22 # 2
#for i in 可迭代对象: #检查一个对象是否为可迭代对象,有__iter__()内部方法 # l=[1,2,3] # l.__iter__() # t=(1,2,3) # t.__iter__() # d={1:"ok1",2:"ok2"} # d.__iter__() #列表,字典,元组之全部能够用for循环,是由于他们都是可迭代对象
#斐波那契数列 #0 1 1 2 3 5 8 13 21 #用递归函数方法 def feibo(n): if n==1: return 0 elif n==2: return 1 else: return feibo(n-1)+feibo(n-2) print(feibo(9)) # 21
#0 1 1 2 3 5 8 13 21 def fibo(max): before,after=0,1 n=0 while n<max : print(after) before,after=after,before+after #先执行右边 n+=1 fibo(5)
#用生成器作斐波那契数列 def fibon(max): before,after=0,1 n=0 while n<max : before,after=after,before+after #先执行右边 n+=1 yield before print(fibon(1)) #生成器对象地址 for i in fibon(5): print(i)
顺便说一下:学生成器yield,是为了往后学习协程,很是关键的知识点ide
def bar(): print("ok1") ret=yield 1 print(ret) print("ok2") print(ret) ret2=yield 2 print(ret2) print("ok3") print(ret) print(ret2) yield 3 b=bar() print(b) print(next(b)) #第一次send若是没有next(),只能传send(None) b.send("edh") b.send("gghg") # send()将yield值返回
第一次send以前没有next,只能传b.send(None)
send和next最大的不一样的是增长了一个新功能,存储yield的值。函数
你们对内容有任何问题,欢迎留言,定在第一时间解答,谢谢你们!学习