python 生成式,迭代器,生成器
DAY 6. 生成式,迭代器,生成器
6.1 生成式
6.1.1 列表生成式
list = [index for index in range(10)]6.1.2 字典生成式
dict = {'zhangsan': 10,'lisi': 12,'wangwu': 18 } # 實(shí)現(xiàn)鍵值互換 dict = {k:v for v,k in dict.items() if k >= 12}6.1.3 集合生成式
# 100以內(nèi)的質(zhì)數(shù) set = {i for i in range(100) if i % 2 != 0}6.2 生成器
生成式會(huì)創(chuàng)建一個(gè)列表(字典或集合),但無(wú)論是字典,列表還是集合,都不能保存一個(gè)無(wú)限長(zhǎng)的序列,比如說(shuō)全體自然數(shù),當(dāng)然我們一般不會(huì)用到這種序列,但哪怕是萬(wàn)位的序列,保存為列表或集合也是很占用空間的,加上一般情況下我們對(duì)一個(gè)序列的操作是一次性的,根本不需要保存,那有沒(méi)有一種辦法只有我們需要時(shí)才給我們數(shù)據(jù),我們不需要時(shí)程序只保留“算法”呢?這就用到了生成器
創(chuàng)建生成器有兩種辦法,一種是類(lèi)似于推導(dǎo)式,把列表推導(dǎo)式的中括號(hào)改為小括號(hào)就行,會(huì)返回一個(gè)生成器對(duì)象,可以使用next()或for循環(huán)遍歷
t = (i for i in range(100) if i % 2 == 0) for i in t:print(i)舉個(gè)栗子,斐波那契數(shù)列,每一項(xiàng)是前兩項(xiàng)之和
一般情況
feibo = [1, 1] for i in range(2,10000):feibo.append(feibo[i - 1] + feibo[i - 2]) print(feibo)我們要做的只是要打印出來(lái)而已,沒(méi)必要保存這么大的數(shù)組,這時(shí)我們可以用生成器
def feb(f, s, max):i = 0while i < max:f, s = s, f + si += 1yield sfor i in feb(1, 1, 100):print(i)生成器長(zhǎng)得和函數(shù)一樣,只不過(guò)return 變成了yield ,每當(dāng)運(yùn)行到y(tǒng)ield后,程序就會(huì)阻塞,只有在調(diào)用該生成器的next()方法時(shí)才會(huì)從上次暫停的地方繼續(xù)
def Demo():print(1)yield 1print(2)yield 2print(3)yield 3demo = Demo() next(demo) next(demo) next(demo) next(demo)# 1 # 2 # 3 # Traceback (most recent call last): # File "E:/xxxx/DAY6_1.py", line 45, in <module> # next(demo) # StopIteration當(dāng)超出生成器范圍時(shí)會(huì)拋出StopIteration異常,我們一般也不會(huì)使用next,for就是捕捉StopIteration異常遍歷生成器的
for i in Demo():i# 等價(jià)于while(True):try:next(demo)except StopIteration:break6.3 迭代器
6.3.1 可迭代對(duì)象
可以直接作用于for循環(huán)的對(duì)象統(tǒng)稱為可迭代對(duì)象:Iterable,主要有兩類(lèi),列表,元組,字典,集合等數(shù)據(jù)類(lèi)型和生成器,可以使用isinstance()判斷一個(gè)對(duì)象是否是Iterable對(duì)象。
6.3.2 迭代器
可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)值的對(duì)象稱為迭代器:Iterator??梢允褂胕sinstance()判斷一個(gè)對(duì)象是否是Iterator對(duì)象
生成器都是Iterator對(duì)象,但list、dict、str雖然是Iterable,卻不是Iterator。把list、dict、str等Iterable變成Iterator可以使用iter()函數(shù)
你可能會(huì)問(wèn),為什么list、dict、str等數(shù)據(jù)類(lèi)型不是Iterator?
這是因?yàn)镻ython的Iterator對(duì)象表示的是一個(gè)數(shù)據(jù)流,Iterator對(duì)象可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)數(shù)據(jù),直到?jīng)]有數(shù)據(jù)時(shí)拋出StopIteration錯(cuò)誤。可以把這個(gè)數(shù)據(jù)流看做是一個(gè)有序序列,但我們卻不能提前知道序列的長(zhǎng)度,只能不斷通過(guò)next()函數(shù)實(shí)現(xiàn)按需計(jì)算下一個(gè)數(shù)據(jù),所以Iterator的計(jì)算是惰性的,只有在需要返回下一個(gè)數(shù)據(jù)時(shí)它才會(huì)計(jì)算。
Iterator甚至可以表示一個(gè)無(wú)限大的數(shù)據(jù)流,例如全體自然數(shù)。而使用list是永遠(yuǎn)不可能存儲(chǔ)全體自然數(shù)的。
6.4 總結(jié)
- 生成式
| 列表生成式 | L = [i for i in range(100) if i % 2 ==0] |
| 字典生成式 | k:v for k, v in dict.items() if k < 10 |
| 集合生成式 | S = {i for i in range(100) if i % 2 ==0} |
- 生成器
創(chuàng)建:
生成式方式和生成器函數(shù)
讀取:
next()或for
- 迭代器
| 迭代器 | 能用next()執(zhí)行的可迭代對(duì)象 |
參考文章:
GitHub python面試題
廖雪峰的官方網(wǎng)站
python 生成器和迭代器有這篇就夠了
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的python 生成式,迭代器,生成器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 酷派D530刷机指引之官方ROM
- 下一篇: python 消息中间件_消息队列中间件