生成器的好處:緩解內存壓力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的值。函數
你們對內容有任何問題,歡迎留言,定在第一時間解答,謝謝你們!學習