国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

python:容器、迭代器、生成器 簡(jiǎn)單介紹

xbynet / 3066人閱讀

摘要:容器迭代器生成器簡(jiǎn)單介紹提供了多種數(shù)據(jù)類(lèi)型來(lái)存放數(shù)據(jù)項(xiàng)。如下迭代器可以被函數(shù)調(diào)用并不斷返回下一個(gè)值的對(duì)象為迭代器,。

python:容器、迭代器、生成器 簡(jiǎn)單介紹

python提供了多種數(shù)據(jù)類(lèi)型來(lái)存放數(shù)據(jù)項(xiàng)。
之前已經(jīng)介紹了幾個(gè)python中常用的容器,分別是列表list、元組tuple、字典dict和集合set。
這幾種數(shù)據(jù)結(jié)構(gòu)在Python中是非常重要的部分,尤其是各自的特性部分。掌握好了,處理數(shù)據(jù)的時(shí)候會(huì)很方便。

容器 container

容器是一種把多個(gè)元素組織在一起的數(shù)據(jù)結(jié)構(gòu)。容器中的元素可以通過(guò)for循環(huán)逐個(gè)地迭代獲取,也可以通過(guò)in關(guān)鍵字來(lái)判斷元素是否在容器中。
在Python中,常見(jiàn)的容器對(duì)象:

list、dequeue...

set、frozenset...

dict、defaultdict、OrderDict...

tuple、namedtuple...

str

file

引用一張之前從其他博文上截的圖,覺(jué)得很形象,很好的解釋了之間的關(guān)系。不過(guò)不好意思,出處找不到了

大部分容器都提供了某種方式可以獲取到其中的每一個(gè)元素,但是這并不是容器本身提供的功能,而是可迭代對(duì)象賦予了容器這種能力。

迭代 iteration 什么叫迭代?

如果給定一個(gè)list或者tuple數(shù)據(jù)類(lèi)型變量,我們可以通過(guò)for循環(huán)來(lái)遍歷這個(gè)list或者tuple,那這種遍歷可以成為迭代。

在java中,迭代list是通過(guò)下標(biāo)index來(lái)完成的,例如:

for (i=0;i

在Python中,迭代是通過(guò)for...in 循環(huán)完成的。Python中的for循環(huán)可以用在string、list、tuple、dict等其他可迭代對(duì)象上。例如:

>>> d = {"a":1,"b":2,"c":3}  
>>> for key in d:     # dict
...     print(key)
...
a
b
c
>>> for ch in "AB":   # str 
... print(ch)
...
A
B

所以,當(dāng)我們使用for循環(huán)時(shí),我們不太去關(guān)心作用的對(duì)象究竟是list、tuple還是其他數(shù)據(jù)類(lèi)型,只要作用于一個(gè)可迭代對(duì)象上,for循環(huán)就可以正常運(yùn)行。
so...

可迭代對(duì)象 iterable

可迭代對(duì)象,Iterable。可直接使用for循環(huán)的對(duì)象統(tǒng)稱(chēng)為可迭代對(duì)象。
那么你可能會(huì)問(wèn),如何去判斷一個(gè)對(duì)象是否是可迭代對(duì)象呢?
ans:方法是通過(guò)引入collections模塊中的Iterable類(lèi)型來(lái)判斷,同時(shí)使用isinstance()。

>>> from collections import Iterable    # 引入Iterable
>>> isinstance("abc",Iterable)
True
>>> isinstance(123,Iterable)
False

補(bǔ)充一小點(diǎn)知識(shí),如何通過(guò)for循環(huán),把list的索引和值都讀出來(lái)呢?使用 enumerate() 來(lái)完成。

Python內(nèi)置的enumerate()枚舉函數(shù)可以把一個(gè)list編程索引-元素對(duì),這樣就可以在for循環(huán)中同時(shí)迭代索引和元素本身。如下:

>>> l=["a","b","c","d"]
>>> for ind,val in enumerate(l):
...        print("%d %s"%(ind,val))
...
0 a
1 b
2 c
3 d
迭代器 iterator

可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)值的對(duì)象為迭代器,iterator。
Python中的iterator對(duì)象是一個(gè)帶狀態(tài)的對(duì)象,表示的是一個(gè)數(shù)據(jù)流,他實(shí)現(xiàn)了如下兩個(gè)方法:

__iter__:返回迭代器本身;

__next__:返回容器的下一個(gè)元素;

雖然list、dict、tuple是可以迭代的對(duì)象,但不是迭代器。
但是可迭代對(duì)象實(shí)現(xiàn)了__iter__方法,該方法返回一個(gè)迭代器對(duì)象。

如何創(chuàng)建迭代器

iter()

如何創(chuàng)建一個(gè)可迭代對(duì)象?通過(guò)調(diào)用iter()方法實(shí)現(xiàn),如下圖所示:

next()

可迭代對(duì)象可以被next()調(diào)用并不斷返回下一個(gè)數(shù)據(jù),直到?jīng)]有數(shù)據(jù)時(shí)拋出StopIteration錯(cuò)誤。如下:

我們可以想象迭代器數(shù)據(jù)流看做是一個(gè)有序的序列,但是不能提前知道序列到底有多長(zhǎng),只能不斷通過(guò)next()函數(shù)來(lái)實(shí)現(xiàn)讀取下一個(gè)數(shù)據(jù)。
所以Iterator的計(jì)算是一個(gè)惰性的,至于在需要返回下一個(gè)數(shù)據(jù)時(shí),他才會(huì)計(jì)算。

Iterator甚至可以表示一個(gè)無(wú)限大的數(shù)據(jù)流,例如全體自然數(shù)。而使用list是永遠(yuǎn)不可能存儲(chǔ)全體自然數(shù)的。
生成器 generator

生成器是一種特殊的迭代器。
一個(gè)函數(shù)只返回一次,但一個(gè)生成器能暫停執(zhí)行并返回一個(gè)中間的結(jié)果,當(dāng)生成器的next()方法被調(diào)用時(shí),它就又會(huì)從離開(kāi)的地方繼續(xù)運(yùn)行,實(shí)現(xiàn)一邊循環(huán)一邊計(jì)算的機(jī)制,這種就稱(chēng)為生成器generator

生成器創(chuàng)建方法

生產(chǎn)器的創(chuàng)建方法有兩種:一是生成器表達(dá)式;二是yield關(guān)鍵字。

生成器表達(dá)式

直接上例子啦:注意一點(diǎn)就是,生成器最外層的是“()”,list最外成是“[]”。

>>> g = ( x*x for x in range(10) )
>>> g
 at 0x010B3690>
# 使用next()來(lái)獲得generator的下一個(gè)返回值
>>> next(g)
0
>>> next(g)
1
# g保存的是算法,每次調(diào)用next(g),就計(jì)算出下一個(gè)元素的值,直到?jīng)]有更多元素時(shí)拋錯(cuò)

yield關(guān)鍵字

如果一個(gè)函數(shù)定義中包含yield關(guān)鍵字,那么這個(gè)函數(shù)就不再是一個(gè)普通的函數(shù),而是一個(gè)generator。
例如,用函數(shù)實(shí)現(xiàn)斐波那契數(shù)列,我們可以使用如下方法:

def fib(max):
    n,a,b = 0,0,1
while n < max:
    print(b)
    a,b=b,a+b
    n = n + 1
    return "done"

其中,fib()定義了斐波那契的推算規(guī)則。
那我們可以把fib()變成generator。如下:

def fib():
    prev,curr = 0,1
    while True:
        yield curr
        prev,curr = curr , curr + prev

上述函數(shù)體中,返回值不是return關(guān)鍵字了,而是yield,函數(shù)返回值是一個(gè)生成器對(duì)象。
當(dāng)執(zhí)行f=fib()時(shí)返回的是一個(gè)生成器對(duì)象,此時(shí)函數(shù)體中的代碼不會(huì)執(zhí)行,只有顯示或隱式調(diào)用next()的時(shí)候才會(huì)真正執(zhí)行里面的代碼。
在每次調(diào)用next()的時(shí)候執(zhí)行,遇到y(tǒng)ield語(yǔ)句返回,再次執(zhí)行時(shí),從上次返回的yield語(yǔ)句處繼續(xù)執(zhí)行。
我們可以通過(guò)一個(gè)例子演示說(shuō)明:

>>> def odd():
...     print("step1")
...     yield 1
...     print("step2")
...     yield 2
...     print("step 3")
...     yield 3
...
>>> o = odd()
>>> next(o)
step1
1
>>> next(o)
step2
2

好啦,今天就寫(xiě)到這~


? thanks for watching, keep on updating...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/42293.html

相關(guān)文章

  • Python進(jìn)階:設(shè)計(jì)模式之迭代模式

    摘要:抓住了迭代器模式的本質(zhì),即是迭代,賦予了它極高的地位。輸出結(jié)果輸出結(jié)果小結(jié)迭代器模式幾乎是種設(shè)計(jì)模式中最常用的設(shè)計(jì)模式,本文主要介紹了是如何運(yùn)用迭代器模式,并介紹了模塊生成迭代器的種方法,以及種生成迭代器的內(nèi)置方法。 showImg(https://segmentfault.com/img/bVbmv7W?w=4272&h=2848); 在軟件開(kāi)發(fā)領(lǐng)域中,人們經(jīng)常會(huì)用到這一個(gè)概念——設(shè)...

    pubdreamcc 評(píng)論0 收藏0
  • Python進(jìn)階:設(shè)計(jì)模式之迭代模式

    摘要:抓住了迭代器模式的本質(zhì),即是迭代,賦予了它極高的地位。輸出結(jié)果輸出結(jié)果小結(jié)迭代器模式幾乎是種設(shè)計(jì)模式中最常用的設(shè)計(jì)模式,本文主要介紹了是如何運(yùn)用迭代器模式,并介紹了模塊生成迭代器的種方法,以及種生成迭代器的內(nèi)置方法。 showImg(https://segmentfault.com/img/bVbmv7W?w=4272&h=2848); 在軟件開(kāi)發(fā)領(lǐng)域中,人們經(jīng)常會(huì)用到這一個(gè)概念——設(shè)...

    sherlock221 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<