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 } # 實現(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 生成器
生成式會創(chuàng)建一個列表(字典或集合),但無論是字典,列表還是集合,都不能保存一個無限長的序列,比如說全體自然數(shù),當然我們一般不會用到這種序列,但哪怕是萬位的序列,保存為列表或集合也是很占用空間的,加上一般情況下我們對一個序列的操作是一次性的,根本不需要保存,那有沒有一種辦法只有我們需要時才給我們數(shù)據(jù),我們不需要時程序只保留“算法”呢?這就用到了生成器
創(chuàng)建生成器有兩種辦法,一種是類似于推導(dǎo)式,把列表推導(dǎo)式的中括號改為小括號就行,會返回一個生成器對象,可以使用next()或for循環(huán)遍歷
t = (i for i in range(100) if i % 2 == 0) for i in t:print(i)舉個栗子,斐波那契數(shù)列,每一項是前兩項之和
一般情況
feibo = [1, 1] for i in range(2,10000):feibo.append(feibo[i - 1] + feibo[i - 2]) print(feibo)我們要做的只是要打印出來而已,沒必要保存這么大的數(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)生成器長得和函數(shù)一樣,只不過return 變成了yield ,每當運行到y(tǒng)ield后,程序就會阻塞,只有在調(diào)用該生成器的next()方法時才會從上次暫停的地方繼續(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當超出生成器范圍時會拋出StopIteration異常,我們一般也不會使用next,for就是捕捉StopIteration異常遍歷生成器的
for i in Demo():i# 等價于while(True):try:next(demo)except StopIteration:break6.3 迭代器
6.3.1 可迭代對象
可以直接作用于for循環(huán)的對象統(tǒng)稱為可迭代對象:Iterable,主要有兩類,列表,元組,字典,集合等數(shù)據(jù)類型和生成器,可以使用isinstance()判斷一個對象是否是Iterable對象。
6.3.2 迭代器
可以被next()函數(shù)調(diào)用并不斷返回下一個值的對象稱為迭代器:Iterator。可以使用isinstance()判斷一個對象是否是Iterator對象
生成器都是Iterator對象,但list、dict、str雖然是Iterable,卻不是Iterator。把list、dict、str等Iterable變成Iterator可以使用iter()函數(shù)
你可能會問,為什么list、dict、str等數(shù)據(jù)類型不是Iterator?
這是因為Python的Iterator對象表示的是一個數(shù)據(jù)流,Iterator對象可以被next()函數(shù)調(diào)用并不斷返回下一個數(shù)據(jù),直到?jīng)]有數(shù)據(jù)時拋出StopIteration錯誤??梢园堰@個數(shù)據(jù)流看做是一個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()函數(shù)實現(xiàn)按需計算下一個數(shù)據(jù),所以Iterator的計算是惰性的,只有在需要返回下一個數(shù)據(jù)時它才會計算。
Iterator甚至可以表示一個無限大的數(shù)據(jù)流,例如全體自然數(shù)。而使用list是永遠不可能存儲全體自然數(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í)行的可迭代對象 |
參考文章:
GitHub python面試題
廖雪峰的官方網(wǎng)站
python 生成器和迭代器有這篇就夠了
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的python 生成式,迭代器,生成器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 酷派D530刷机指引之官方ROM
- 下一篇: 最小费用最大流