日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 生成式,迭代器,生成器

發(fā)布時間:2023/12/20 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 生成式,迭代器,生成器 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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以內的質數(shù) set = {i for i in range(100) if i % 2 != 0}

6.2 生成器

生成式會創(chuàng)建一個列表(字典或集合),但無論是字典,列表還是集合,都不能保存一個無限長的序列,比如說全體自然數(shù),當然我們一般不會用到這種序列,但哪怕是萬位的序列,保存為列表或集合也是很占用空間的,加上一般情況下我們對一個序列的操作是一次性的,根本不需要保存,那有沒有一種辦法只有我們需要時才給我們數(shù)據(jù),我們不需要時程序只保留“算法”呢?這就用到了生成器

創(chuàng)建生成器有兩種辦法,一種是類似于推導式,把列表推導式的中括號改為小括號就行,會返回一個生成器對象,可以使用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后,程序就會阻塞,只有在調用該生成器的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:break

6.3 迭代器

6.3.1 可迭代對象

可以直接作用于for循環(huán)的對象統(tǒng)稱為可迭代對象:Iterable,主要有兩類,列表,元組,字典,集合等數(shù)據(jù)類型和生成器,可以使用isinstance()判斷一個對象是否是Iterable對象。

6.3.2 迭代器

可以被next()函數(shù)調用并不斷返回下一個值的對象稱為迭代器: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ù)調用并不斷返回下一個數(shù)據(jù),直到沒有數(shù)據(jù)時拋出StopIteration錯誤。可以把這個數(shù)據(jù)流看做是一個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()函數(shù)實現(xiàn)按需計算下一個數(shù)據(jù),所以Iterator的計算是惰性的,只有在需要返回下一個數(shù)據(jù)時它才會計算。

Iterator甚至可以表示一個無限大的數(shù)據(jù)流,例如全體自然數(shù)。而使用list是永遠不可能存儲全體自然數(shù)的。

6.4 總結

  • 生成式
生成式語法
列表生成式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

  • 迭代器
可迭代對象能被for直接作用的對象
迭代器能用next()執(zhí)行的可迭代對象

參考文章:

GitHub python面試題

廖雪峰的官方網站

python 生成器和迭代器有這篇就夠了

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結

以上是生活随笔為你收集整理的python 生成式,迭代器,生成器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。