久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網
最全最豐富的資訊網站

Python詳細解析之容器、可迭代對象、迭代器以及生成器

本篇文章給大家帶來了關于python的相關知識,其中主要介紹了關于容器、可迭代對象、迭代器以及生成器的相關問題,下面就一起來看一下,希望對大家有幫助。

Python詳細解析之容器、可迭代對象、迭代器以及生成器

推薦學習:python視頻教程

在剛開始學Python的時候,是不是經常會聽到大佬們在講容器、可迭代對象、迭代器、生成器、列表/集合/字典推導式等等眾多概念,其實這不是大佬們沒事就擱那扯專業術語來裝B,而是這些東西都得要明白的,光知道字符串、列表等基礎還是不夠的,尤其是在Python的數據結構方面。

今天就來給大家講講Python中的容器、可迭代對象、迭代器和生成器這些難理解的概念,讓你的Python基礎更上一層樓!

一、容器

1.什么是容器?

在Python中,容器是把多種元素組織在一起的數據結構,容器中的元素就可以逐個迭代獲取。說白了,它的作用就像它的名字一樣:用來存放東西(數據)。

容器實際上是不存在的,它并不是一種數據類型,只是人為的一種概念,只是為了方便學習所創造的一個概念詞,它可以用成員關系操作符(in或not in)來判斷對象是否在容器里面。

當然了,它不是我創造的,我沒有那么大本事哈,是官方創造的好吧,你也不用擔心我是在教你一些奇奇怪怪的名詞,說出去別人都聽不懂…python中都是這么叫的。常見的容器類型有列表(list)、元組(tuple)、字符串(str)、字典(dict)以及集合(set )

既然容器里面的數據是可以迭代獲取的,那么我們又得來學一個新概念:可迭代對象。


二、可迭代對象

1.什么是可迭代對象?

在python中,可迭代對象并不是指某種具體的數據類型,它是指存儲了元素的一個容器對象

也就是說,如果容器里面沒有存儲數據,那它就不是可迭代對象,并不是所有的容器都是可迭代對象,容器包含但并不僅限于可迭代對象。

注意兩個點:

1.很多容器都是可迭代對象(容器包含了可迭代對象)。  2.一個可迭代對象是不能獨立的進行迭代的,迭代是通過for來完成的,凡是可迭代對象都可以直接使用for循環進行訪問。

for循環大家應該不陌生吧?有沒有想過,for循環內部是怎么實現的?比如說這個for循環的例子,為什么能輸出列表里的每一個元素?它的內部是怎么實現的?

Python詳細解析之容器、可迭代對象、迭代器以及生成器

其實for循環做了兩件事情:

1.使用 __iter__() 返回1個迭代器,迭代器在下面會講,這里先知道有這么個東西。  2.使用 __next__() 獲取迭代器中的每一個元素。

那么我們不用for循環來輸出列表里的每一個元素,

l = [1,2,3,4]# for i in l:#     print(i)ite =l.__iter__() #接收一下ietr()干了什么print(ite)   #打印print(ite.__next__())     #for循環干第2件事情的時候做的第1步print(ite.__next__())     #for循環干第2件事情的時候做的第2步print(ite.__next__())     #for循環干第2件事情的時候做的第3步print(ite.__next__())     #for循環干第2件事情的時候做的第4步

輸出結果:

Python詳細解析之容器、可迭代對象、迭代器以及生成器

可以看出來,如果我們去掉哪行打印ite的代碼,執行效果就是跟for循環輸出列表里面的每一個元素是一樣的,for循環里面限定了范圍是4次,實際上就執行了1次__iter__()和4次__next__(),也就是說for循環訪問迭代對象的本質就是通過這么去實現的。

而且,for循環本質上干的那兩件事情,缺一不可,也就是說如果沒有__iter__()先返回了迭代器,__next()__也無法獲取到元素,恰恰說明了前面說要注意的兩點中的第2點:一個可迭代對象是不能獨立的進行迭代的。

有兩個內置函數跟它們原理是一樣的,本質相同,一般要用的話用內置函數要方便一些,起碼不用寫那么多下劃線:

內置函數 iter() 的本質是 __inter__() ,也是返回一個迭代器。  內置函數 next() 的本質是 __next__(),也是有了迭代器之后獲取元素。

Python詳細解析之容器、可迭代對象、迭代器以及生成器

可以看出來結果也是一模一樣的,既然講到了迭代器,那么就來看看什么是迭代器。

三、迭代器

通過上面的for循環例子我們大概也能看得出來,

只要是實現了__iter__()和__next__()的對象,就是迭代器,迭代器是一個可迭代對象。  總之,迭代器是有__iter__()生成,可以通過__next__()進行調用。

既然如此,我們在學Python基礎的時候講過range()是一個可迭代對象,那么它也是可以通過__iter__()生成一個迭代器的。

Python詳細解析之容器、可迭代對象、迭代器以及生成器


四、序列

序列在【賦值語句】那個專題文章中我有提過,這里再講一下,序列也是一個抽象的概念,它包含了列表、元組和字符串,它本身是不存在的,也是便于學習所創造的一個概念詞。

可迭代對象包含序列,既然序列包含了列表、元組和字符串,前面我們的例子中也涉及到 了,所以說序列可以被iter()和next()使用

序列可以分為有限序列和無限序列。有限序列就是有范圍的,比如說range(10)就已經限定了范圍,相反的,無限序列也就是沒有限定范圍的序列。

我們來生成一個無限序列,這里需要用到1個新模塊itertools,itertools用于高效循環的迭代函數集合,它下面有一個方法count(),可生成迭代器且無范圍,可以理解為無限迭代器。

Python詳細解析之容器、可迭代對象、迭代器以及生成器

通過這個例子我們可以看出來,只要執行一次,next()就會獲取一次迭代器里面的內容并逐次獲取,我這里只寫了4個next(),你多寫幾次就會多輸出幾次。

像next()這種什么時候需要就什么時候調用的機制叫做懶加載機制,也叫懶漢式加載;

相反地就有餓漢式加載。比如for循環這種的,只要一執行就會把可迭代器里面的所有對象都獲取。


五、列表推導式

列表推導式跟生成器有關,在講生成器之前,需要先知道什么是列表推導式,列表推導式就是生成列表的一種方法,語法是這樣的:

l = [i for i in 可迭代對象]

i表示要放進列表里的對象,for循環是一個式子。

比如我們用列表推導式來生成一個列表試試:

l = [i for i in range(5)]print(l)

運行結果:

[0, 1, 2, 3, 4]

運用列表推導式可以很方便地生成我們想要的列表。

同時它也有很多靈活的用法,比如在后面加上條件判斷

l = [i for i in range(5) if 4<5]print(l)

運行結果:

[0, 1, 2, 3, 4]

if后面的條件判斷為真,則可以正常生成列表,如果為假,則列表推導式是無效的,此時的l將是一個空列表。

還有其他靈活的用法,比如操作前面的i,比如讓i的數值全都翻2倍:

Python詳細解析之容器、可迭代對象、迭代器以及生成器

我們把迭代對象換一下,換成字符串,也同樣可以輸出,只是*在字符串里面表示重復操作符,所以效果變成了這樣:

Python詳細解析之容器、可迭代對象、迭代器以及生成器

不僅如此,前面的i*2我們還可以用函數來進行操作,比如:

Python詳細解析之容器、可迭代對象、迭代器以及生成器

總而言之,列表推導式就是用來快速和自定義生成列表的一種方法,很靈活

那么有人可能會舉一反三了,列表推導式都是用 [] 來進行操作的,那如果用()來操作行嗎?它會不會生成一個元組?我們來看看:

Python詳細解析之容器、可迭代對象、迭代器以及生成器

[] 換成()之后,返回的是一個生成器generrator ,那么下面我們再來講講生成器:


六、生成器

生成器是真實存在于Python中的對象,與容器這種概念詞是不同的,它是可以直接通過next()進行調用的。

1.生成器的第一種創建方法:生成器表達式

第一種創建方法跟列表推導式是差不多的,就是 [] 換成了():

l = (i for i in 可迭代對象)

比如我們來生成一個生成器,看看能不能用next()直接調用:

l = (i for i in "abcd")print(next(l))

運行結果:

a

可以看出,生成器是可以直接調用的。那么既然生成器可以被next()調用,那么生成器就是一個特殊的迭代器,是一個可迭代對象

2.生成器的第二種創建方法:yield

除了用上面那種方法創建生成器,還可以用yield來創建,方法如下:

yield 關鍵字

比如說我們用一個函數中包含yield來創建生成器:

def fun():     a = 10     while 1:         a += 1         yield a   b = fun()print(b)

運行結果:

<generator object fun at 0x000001F2AD95E900>

結果就是生成了一個生成器,而且此時的函數fun()就已經不再是一個函數了,它是一個生成器,只要函數中出現了yield,函數就變成了生成器。

為什么while循環沒有一直執行?先不著急,我們輸出看看:

def fun():     a = 10     while 1:         a += 1         yield a   b = fun()print(next(b))print(next(b))print(next(b))

運行結果:

111213

我調用了三次,所以它就運行了三次,while循環雖然存在,但是卻不起作用,是因為前面我們提過的懶漢式加載

什么時候需要了,什么時候用next()調用,就是懶漢式加載,不像餓漢式加載那樣,提前生成了所有對象,如果這里換成for循環來完成,比如:

def fun():     a = 10     while 1:         a += 1         print(a)b = fun()

運行之后程序將會進入死循環,一直給a自加1,你可以試試看效果,這就是餓漢式加載提前生成了迭代器并調用了全部迭代器對象,餓漢式加載占用資源的放大鏡

七、小結

今天講的內容可能聽起來比較枯燥,這也是沒得辦法的,有些東西第一次聽可能有點”難以下咽“,見得多了之后就習慣了,你得強迫自己去試著接受和理解這些抽象的東西。

最后用一張圖來總結一下它們的關系:

Python詳細解析之容器、可迭代對象、迭代器以及生成器

推薦學習:python教程

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
亚洲v在线看| 日本h片久久| 精品亚洲二区| 国产视频网站一区二区三区| 日韩亚洲精品在线观看| 日本亚州欧洲精品不卡| 亚洲精品欧美| 91午夜精品| 国产精品探花在线观看| 国产精品中文字幕制服诱惑| 国产精品视频一区二区三区综合| 国产美女撒尿一区二区| 国产精品网址| 精品美女久久| 综合日韩av| 国产精品xvideos88| 国产私拍福利精品视频二区| 欧美精品二区| 成人台湾亚洲精品一区二区| 超级白嫩亚洲国产第一| 神马午夜久久| 妖精视频成人观看www| 蜜臀精品久久久久久蜜臀 | 国产美女一区| 老鸭窝亚洲一区二区三区| 只有精品亚洲| 国产欧美日韩免费观看| 国产精品中文字幕制服诱惑| 精品久久99| 久久精品国产68国产精品亚洲| 欧美在线网站| 婷婷久久免费视频| 麻豆成人91精品二区三区| 成人午夜精品| 视频一区视频二区中文字幕| 欧美日韩一区二区国产| 国产黄大片在线观看| 一本一本久久| 国产伦理久久久久久妇女| 成人午夜在线| 午夜精品一区二区三区国产| 青草国产精品| 美腿丝袜亚洲一区| 久久视频精品| 亚久久调教视频| 国产一区二区三区不卡av | 国产不卡人人| 先锋影音久久久| 国产精品美女午夜爽爽| 久久久久99| 亚洲人成精品久久久| 精品视频一二| 亚洲精品成人| 国产精品中文字幕亚洲欧美| 亚洲不卡av不卡一区二区| 日本伊人午夜精品| 精品国产不卡一区二区| 国产一区久久| 久久不卡国产精品一区二区| 美女网站一区| 国产精品视频一区二区三区四蜜臂| 欧美日韩国产一区二区三区不卡| 欧美日韩精品一区二区三区视频 | 日本中文字幕一区二区| 国产不卡精品在线| 丝袜美腿亚洲一区| 国产精品第十页| 狠狠色综合网| 国产精品mm| 久久都是精品| 国产精品精品| 日韩av电影一区| 欧美日韩在线二区| 国产精成人品2018| 国产麻豆综合| 亚洲播播91| 国产精品欧美日韩一区| 日韩视频久久| 日韩免费av| 国产激情一区| 视频一区国产视频| 肉色欧美久久久久久久免费看| 日韩在线麻豆| 黑丝一区二区三区| 日韩欧美精品| 国产亚洲观看| 亚洲一区二区三区四区五区午夜| 国产aa精品| 国产日韩欧美中文在线| 国产二区精品| 国产福利电影在线播放| 欧美另类中文字幕 | 日韩av专区| 91精品福利观看| 免费日韩一区二区| 久久精品卡一| 都市激情国产精品| 国产精品美女午夜爽爽| 亚洲aⅴ网站| 亚洲激情中文| 欧美日一区二区| 国产网站在线| 精品视频自拍| 精品一区二区三区视频在线播放| 日本视频中文字幕一区二区三区| 性欧美长视频| 久久成人精品| 红桃视频国产一区| 午夜影院一区| 日产午夜精品一线二线三线| 国产精品qvod| 欧美日韩亚洲一区三区| 日韩精品亚洲专区| 亚洲婷婷丁香| 热久久国产精品| 99久久久久国产精品| 日韩免费福利视频| 欧美激情一区| 欧美三级第一页| 日本不卡视频一二三区| 午夜精品影视国产一区在线麻豆| 在线一区免费观看| 激情久久中文字幕| 欧美肉体xxxx裸体137大胆| 欧美日韩尤物久久| 日本美女一区| 久久中文亚洲字幕| 欧美日中文字幕| 国产一区二区三区自拍| 91精品91| 国产婷婷精品| 丝袜美腿亚洲一区| 亚洲综合激情在线| 亚洲精品进入| 日韩激情综合| 国产欧美日韩影院| 麻豆国产精品| 国产精品99在线观看| 人人草在线视频| 亚洲播播91| 亚洲二区三区不卡| 最新日韩av| 日本v片在线高清不卡在线观看| 日韩av在线播放中文字幕| 欧美在线看片| 麻豆精品国产91久久久久久| 高清一区二区| 色老板在线视频一区二区| 999久久久免费精品国产| 国内精品福利| 亚洲一区二区日韩| 欧美一区二区三区久久精品| 国产精品一区二区精品视频观看| 国产精品日本一区二区不卡视频 | 伊人久久大香线蕉av不卡| 久久精品国产大片免费观看| 亚洲精品97| 亚洲精品九九| 国产精品xxx| 色一区二区三区四区| 久久久久久婷| 亚洲激情欧美| 日韩av黄色在线| 国产91在线播放精品| 精品一区在线| 亚洲欧洲日韩精品在线| 美女在线视频一区| 美女毛片一区二区三区四区| 日韩综合一区二区| 国产中文字幕一区二区三区| 激情婷婷欧美| 91精品日本| 久久天堂av| 偷拍亚洲精品| 中国字幕a在线看韩国电影| 久久要要av| 日韩不卡一二三区| 日韩在线看片| 日本不卡的三区四区五区| 国产不卡人人| 亚洲青青久久| 蜜桃av在线播放| 蜜桃一区二区三区在线观看| 麻豆精品久久久| 亚洲成人日韩| 欧美激情aⅴ一区二区三区 | 国产精区一区二区| 91精品在线观看国产| 中文字幕av一区二区三区四区| 精品网站999| 日韩中文字幕1| 成人在线超碰| 日韩中文字幕| 欧美日韩一区二区综合| 国产日韩中文在线中文字幕 | 中文在线免费视频| 日精品一区二区三区| 国产99亚洲| 精品美女在线视频| 日韩一区精品|