什么是生成器?
可以理解為一種數據類型,這種數據自動實現了迭代器協議(其他數據類型需要調用自己內置的
_iter_
方法),所以生成器就是可迭代對象
python提供生成器的兩種表現形式:
1.生成器函數:
常規函數的定義,但是,使用
yield
語句而不是
return
語句返回結果。
yield
語句一次返回一個結果,在每個結果中間,掛起函數的狀態,以便下次從它離開的地方繼續執行。**函數里有yiled,執行函數就是一個生成器,不管yield位置在哪。采集函數創建生成器時,如果函數中含有return,則不會通過return得到任憑結果,return中止當前生成器,如果執行next()會報錯。**簡單示例如下:
def
test
(
)
:
global
callback
callback
=
yield
2
print
(
callback
)
callback2
=
yield
1
print
(
callback2
)
yield
3
g
=
test
(
)
print
(
g
)
print
(
g
.
__next__
(
)
)
print
(
g
.
send
(
"這是傳到生成器里面的值"
)
)
print
(
g
.
send
(
"這是傳到生成器2里面的值"
)
)
結果:
<
generator
object
test at
0x000000000260A5C8
>
2
這是傳到生成器里面的值
1
這是傳到生成器
2
里面的值
3
return的問題上面說過,就不實例了
這里說下next和send:
首先:要執行send之前,必須要先至少執行一個next
兩者效果大體相同,只是send在執行是可以給生成器里的當前執行到的yield(這也是為什么要先next,不然生成器函數沒開始執行,沒到yield)一個返回值。
2.生成器表達式:
類似于列表推導,但是生成器返回按需要產生的一個對象,而不是一次構建一個結果列表
補充一個列表解析
"SB" if name=="alex" else "shuaige"
用法:
name="alex"
res="SB" if name=="alex" else "shuaige"
print(res)
name="yueshouhu"
res="SB" if name=="alex" else "shuaige"
print(res)
結果是:
SB
shuaige
。。。。。。。。。。。。。。。。。。。。。。。。。。
number_list=[ i for i in range(10)]
print(number_list)
傳統代碼
number_list=[]
for i in range(10):
number_list.append(i)
print(number_list)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
列表解析:
number_list=[ i for i in range(10) if i>5]
print(number_list)
[6, 7, 8, 9]
用列表解析的好處是相較于傳統代碼更便利,但是列表解析是直接生成一個完整列表放到內存中,很占內存,并且影響運行效率。
如執行
number_list=[ i for i in range(10000000000000000000000000000)]
,電腦將會直接卡死,只能重啟,故需要使用生成器表達式
生成器表達式
number_list=(i for i in range(1000000000000000000))
將原有列表解析的[ ] 改成()
number_list=(i for i in range(1000000000000000000)if i>10)
print(number_list)
print(number_list.__next__())
print(number_list.__next__())
結果:
at 0x00000000026D6468>
11
12
綜上,生成器的好處:
使用生成器對延遲操作提供了支持。所謂延遲操作,是指在需要的時候才產生結果,而不是立即產生所有結果放到內存里。
生成器小結;
1.是可迭代對象
2.實現了延遲操作,省內存
3.生成器和其他數據類型本質一樣,都是實現了迭代器協議,只不過生成器附加了一個延遲計算省內存的好處,其他的可迭代對象可沒有這點好處
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
