摘要:容器迭代器生成器簡單介紹提供了多種數據類型來存放數據項。如下迭代器可以被函數調用并不斷返回下一個值的對象為迭代器,。
python:容器、迭代器、生成器 簡單介紹
python提供了多種數據類型來存放數據項。
之前已經介紹了幾個python中常用的容器,分別是列表list、元組tuple、字典dict和集合set。
這幾種數據結構在Python中是非常重要的部分,尤其是各自的特性部分。掌握好了,處理數據的時候會很方便。
容器是一種把多個元素組織在一起的數據結構。容器中的元素可以通過for循環逐個地迭代獲取,也可以通過in關鍵字來判斷元素是否在容器中。
在Python中,常見的容器對象:
list、dequeue...
set、frozenset...
dict、defaultdict、OrderDict...
tuple、namedtuple...
str
file
引用一張之前從其他博文上截的圖,覺得很形象,很好的解釋了之間的關系。不過不好意思,出處找不到了
大部分容器都提供了某種方式可以獲取到其中的每一個元素,但是這并不是容器本身提供的功能,而是可迭代對象賦予了容器這種能力。
迭代 iteration 什么叫迭代?如果給定一個list或者tuple數據類型變量,我們可以通過for循環來遍歷這個list或者tuple,那這種遍歷可以成為迭代。
在java中,迭代list是通過下標index來完成的,例如:
for (i=0;i在Python中,迭代是通過for...in 循環完成的。Python中的for循環可以用在string、list、tuple、dict等其他可迭代對象上。例如:
>>> 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所以,當我們使用for循環時,我們不太去關心作用的對象究竟是list、tuple還是其他數據類型,只要作用于一個可迭代對象上,for循環就可以正常運行。
可迭代對象 iterable
so...可迭代對象,Iterable。可直接使用for循環的對象統稱為可迭代對象。
那么你可能會問,如何去判斷一個對象是否是可迭代對象呢?
ans:方法是通過引入collections模塊中的Iterable類型來判斷,同時使用isinstance()。>>> from collections import Iterable # 引入Iterable >>> isinstance("abc",Iterable) True >>> isinstance(123,Iterable) False補充一小點知識,如何通過for循環,把list的索引和值都讀出來呢?使用 enumerate() 來完成。
Python內置的enumerate()枚舉函數可以把一個list編程索引-元素對,這樣就可以在for循環中同時迭代索引和元素本身。如下:
>>> 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()函數調用并不斷返回下一個值的對象為迭代器,iterator。
Python中的iterator對象是一個帶狀態的對象,表示的是一個數據流,他實現了如下兩個方法:__iter__:返回迭代器本身;
__next__:返回容器的下一個元素;
雖然list、dict、tuple是可以迭代的對象,但不是迭代器。
如何創建迭代器
但是可迭代對象實現了__iter__方法,該方法返回一個迭代器對象。iter()
如何創建一個可迭代對象?通過調用iter()方法實現,如下圖所示:
next()
可迭代對象可以被next()調用并不斷返回下一個數據,直到沒有數據時拋出StopIteration錯誤。如下:
我們可以想象迭代器數據流看做是一個有序的序列,但是不能提前知道序列到底有多長,只能不斷通過next()函數來實現讀取下一個數據。
所以Iterator的計算是一個惰性的,至于在需要返回下一個數據時,他才會計算。Iterator甚至可以表示一個無限大的數據流,例如全體自然數。而使用list是永遠不可能存儲全體自然數的。生成器 generator生成器是一種特殊的迭代器。
生成器創建方法
一個函數只返回一次,但一個生成器能暫停執行并返回一個中間的結果,當生成器的next()方法被調用時,它就又會從離開的地方繼續運行,實現一邊循環一邊計算的機制,這種就稱為生成器generator。生產器的創建方法有兩種:一是生成器表達式;二是yield關鍵字。
生成器表達式
直接上例子啦:注意一點就是,生成器最外層的是“()”,list最外成是“[]”。
>>> g = ( x*x for x in range(10) ) >>> gat 0x010B3690> # 使用next()來獲得generator的下一個返回值 >>> next(g) 0 >>> next(g) 1 # g保存的是算法,每次調用next(g),就計算出下一個元素的值,直到沒有更多元素時拋錯 yield關鍵字
如果一個函數定義中包含yield關鍵字,那么這個函數就不再是一個普通的函數,而是一個generator。
例如,用函數實現斐波那契數列,我們可以使用如下方法: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()定義了斐波那契的推算規則。
那我們可以把fib()變成generator。如下:def fib(): prev,curr = 0,1 while True: yield curr prev,curr = curr , curr + prev上述函數體中,返回值不是return關鍵字了,而是yield,函數返回值是一個生成器對象。
當執行f=fib()時返回的是一個生成器對象,此時函數體中的代碼不會執行,只有顯示或隱式調用next()的時候才會真正執行里面的代碼。
在每次調用next()的時候執行,遇到yield語句返回,再次執行時,從上次返回的yield語句處繼續執行。
我們可以通過一個例子演示說明:>>> 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好啦,今天就寫到這~
? thanks for watching, keep on updating...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/42293.html
摘要:抓住了迭代器模式的本質,即是迭代,賦予了它極高的地位。輸出結果輸出結果小結迭代器模式幾乎是種設計模式中最常用的設計模式,本文主要介紹了是如何運用迭代器模式,并介紹了模塊生成迭代器的種方法,以及種生成迭代器的內置方法。 showImg(https://segmentfault.com/img/bVbmv7W?w=4272&h=2848); 在軟件開發領域中,人們經常會用到這一個概念——設...
摘要:抓住了迭代器模式的本質,即是迭代,賦予了它極高的地位。輸出結果輸出結果小結迭代器模式幾乎是種設計模式中最常用的設計模式,本文主要介紹了是如何運用迭代器模式,并介紹了模塊生成迭代器的種方法,以及種生成迭代器的內置方法。 showImg(https://segmentfault.com/img/bVbmv7W?w=4272&h=2848); 在軟件開發領域中,人們經常會用到這一個概念——設...
閱讀 1191·2021-10-11 10:59
閱讀 1969·2021-09-29 09:44
閱讀 860·2021-09-01 10:32
閱讀 1435·2019-08-30 14:21
閱讀 1877·2019-08-29 15:39
閱讀 2984·2019-08-29 13:45
閱讀 3539·2019-08-29 13:27
閱讀 2015·2019-08-29 12:27