Python学习day12(生成器,列表/生成器推导式)
生成器
初始生成器
我們知道的迭代器有兩種:一種是調(diào)用方法直接返回的,一種是可迭代對象通過執(zhí)行iter方法得到的,迭代器有的好處是可以節(jié)省內(nèi)存。
如果在某些情況下,我們也需要節(jié)省內(nèi)存,就只能自己寫。我們自己寫的這個能實(shí)現(xiàn)迭代器功能的東西就叫生成器。
Python中提供的生成器:
1.生成器函數(shù):常規(guī)函數(shù)定義,但是,使用yield語句而不是return語句返回結(jié)果。yield語句一次返回一個結(jié)果,在每個結(jié)果中間,掛起函數(shù)的狀態(tài),以便下次重它離開的地方繼續(xù)執(zhí)行
2.生成器表達(dá)式:類似于列表推導(dǎo),但是,生成器返回按需產(chǎn)生結(jié)果的一個對象,而不是一次構(gòu)建一個結(jié)果列表
生成器Generator
本質(zhì):迭代器(所以自帶了__iter__方法和__next__方法,不需要我們?nèi)?shí)現(xiàn))
特點(diǎn):惰性運(yùn)算,開發(fā)者自定義
生成器函數(shù)
一個包含yield關(guān)鍵字的函數(shù)就是一個生成器函數(shù)。yield可以為我們從函數(shù)中返回值,但是yield又不同于return,return的執(zhí)行意味著程序的結(jié)束,調(diào)用生成器函數(shù)不會得到返回的具體的值,而是得到一個可迭代的對象。每一次獲取這個可迭代對象的值,就能推動函數(shù)的執(zhí)行,獲取新的返回值。直到函數(shù)執(zhí)行結(jié)束。
import time def genrator_fun1():a = 1print('現(xiàn)在定義了a變量')yield ab = 2print('現(xiàn)在又定義了b變量')yield bg1 = genrator_fun1() print('g1 : ',g1) #打印g1可以發(fā)現(xiàn)g1就是一個生成器 print('-'*20) #我是華麗的分割線 print(next(g1)) time.sleep(1) #sleep一秒看清執(zhí)行過程 print(next(g1))生成器有什么好處呢?就是不會一下子在內(nèi)存中生成太多數(shù)據(jù)
假如我想讓工廠給學(xué)生做校服,生產(chǎn)2000000件衣服,我和工廠一說,工廠應(yīng)該是先答應(yīng)下來,然后再去生產(chǎn),我可以一件一件的要,也可以根據(jù)學(xué)生一批一批的找工廠拿。
而不能是一說要生產(chǎn)2000000件衣服,工廠就先去做生產(chǎn)2000000件衣服,等回來做好了,學(xué)生都畢業(yè)了。。。
send
def generator():print(123)content = yield 1print('=======',content)print(456)yield2g = generator() ret = g.__next__() print('***',ret) ret = g.send('hello') #send的效果和next一樣 print('***',ret)#send 獲取下一個值的效果和next基本一致 #只是在獲取下一個值的時候,給上一yield的位置傳遞一個數(shù)據(jù) #使用send的注意事項(xiàng)# 第一次使用生成器的時候 是用next獲取下一個值# 最后一個yield不能接受外部的值列表推導(dǎo)式和生成器表達(dá)式
l = [i for i in range(10)] print(l) l1 = ['選項(xiàng)%s'%i for i in range(10)] print(l1)1.把列表解析的[]換成()得到的就是生成器表達(dá)式
2.列表解析與生成器表達(dá)式都是一種便利的編程方式,只不過生成器表達(dá)式更節(jié)省內(nèi)存
3.Python不但使用迭代器協(xié)議,讓for循環(huán)變得更加通用。大部分內(nèi)置函數(shù),也是使用迭代器協(xié)議訪問對象的。例如, sum函數(shù)是Python的內(nèi)置函數(shù),該函數(shù)使用迭代器協(xié)議訪問對象,而生成器實(shí)現(xiàn)了迭代器協(xié)議,所以,我們可以直接這樣計(jì)算一系列值的和:
sum(x ** 2 for x in range(4)) posted on 2018-08-25 17:29 SunnyHu 閱讀(...) 評論(...) 編輯 收藏轉(zhuǎn)載于:https://www.cnblogs.com/hyg19910701/p/9534774.html
總結(jié)
以上是生活随笔為你收集整理的Python学习day12(生成器,列表/生成器推导式)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浦发美运新贵白金卡年费多吗?年费多少?
- 下一篇: 浦发美运新贵白金卡申请条件有哪些?这几点