本質就是迭代器,他是python本身用代碼寫的迭代器python
用如下兩種方式構建一個生成器
1.經過生成器表達式
2.聲稱器表達式
生成器函數
# def func(x): # x+=1 # print(111) # print(111) # yield x # x+=2 # print(222) # yield 'alex' # x+=3 # g_obj=func(5) # print(g_obj) # print(g_obj.__next__()) # print(g_obj.__next__()) # 一個next對應一個yield # yield將值返回給 生成器對象.__next__()
return 結束函數,給函數的執行者一個返回值yield
不會結束函數,一個next 對應一個yield,
給生成器對象.__next__()返回值
生成器迭代器的區別
生成器函數,vs迭代器
區別1:自定製的區別
# l1=[1,2,3,4,5] # print(l1.__iter__()) # def func1(x): # x+=1 # yield x # x+=3 # yield x # x+=5 # yield x # g1 =func1(5) # print(g1.__next__()) # print(g1.__next__()) # print(g1.__next__())
內存級別的區別
迭代器須要可迭代對象進行轉化,可迭代對象很是佔內存
生成器直接建立,不須要轉化,從本質上就節省內存
send 與next
# def func1(): # print(1) # count=yield 6 # print(count) # print(2) # count1=yield 7 # print(count1) # print(3) # yield 8 # g=func1() # # print(func1()) # next(g) # g.send('alex') # g.send('alex') # print() # g.send('太白') # g.send('太白')
·send 與next同樣,也是對生成器取值,(執行一個yield,取一次值)的方法
send能夠給上一個yield 傳值
第一次取值永遠都是next
最後一個yield 永遠也得不到send傳的值
# def cloth1(n): # # for i in range(n+1): # # print('衣服%s號' %i) # # cloth1(10000) # def cloth2(n): # for i in range(1,n+1): # yield '衣服的%s號' % i # g=cloth2(10000) # for i in range(50): # print(g.__next__()) # for i in range(50): # print(g.__next__())
列表推導式:一行代碼幾乎搞定你須要的任何列表
循環模式,[變量 (加工後的變量) for 變量 in iterable]
# li=[i for i in range(1,101)] # print(li)
篩選模式,[變量 (加工後的變量) for 變量 in iterable if 條件]
# l1=[i for i in range(1,31) if i%3==0] # # print(l1)
列表推導式
優勢:一行解決,方便
缺點:不易排錯,不能超過3次循環
生成器表達式:將列表推導式的[]換成()便可
# g=(i for i in range(100)) # print(g) # print(g.__next__()) # print(g.__next__())
字典推導式
字典的鍵和值對調
# mcase={'a':10,'b':34} # # mcase_frequency={mcase[k]:k for k in mcase} # # print(mcase) # squared={x**2 for x in [1,-1,2]} # print(squared)