1樓:龍氏風采
毋庸置疑,迭代器有很多好處:
「流式」資料處理方式減少記憶體消耗:比如處理檔案,一下猛地把全部資料全部取出來放到記憶體裡面進行處理會導致程式消耗大量記憶體,有時甚至沒法做到,一般我們會一部分一部分的對檔案內容進行處理:
for text_line in open("xx.txt"): print text_line
或者對xml檔案進行處理的時候:
tree = etree.iterparse(xml, ['start', 'end']) for event, elem in tree: if event == "end" result = etree.
tostring(elem) elem.clear() print result
內建函式 open 返回的 file 物件和 etree.iterparse 序列化的xml tree都是可迭代物件,能夠讓我們漸進式地對檔案的內容進行處理。
支援方便用 for 語句對資料進行消費:
python內建的一些常見的像型別像 陣列、列表甚至字串 等都是可迭代型別,這樣我們就能方便 for 語句這個語法糖方便對資料進行消費,不需要自己記錄索引位置,人肉迴圈:
for i in [1, 2, 3, 4] print i,
簡單瞭解了一下迭代器的好處後,我們正正緊緊的聊聊python的迭代器模式
在這裡我們引入兩個比較繞口的名詞: 可迭代物件 和 迭代器物件 ,個人覺得從這兩個概念下手會對迭代器有比較好的理解。在放例子前先對這兩個概念給一個不入流的解釋:
可迭代物件 :物件裡面包含 __iter()__ 方法的實現,物件的 iter 函式經呼叫之後會返回一個迭代器,裡面包含具體資料獲取的實現。 迭代器 :
包含有 next 方法的實現,在正確範圍內返回期待的資料以及超出範圍後能夠丟擲 stopiteration 的錯誤停止迭代。
放個例子邊看邊說:
class iterable_range: def __init__(self, n): self.
n = n def __iter__(self): return my_range_iterator(self.n) class my_range_iterator:
def __init__(self, n): self.i = 0 self.
n = n def next(self): if self.i < self.
n: i = self.i self.
i += 1 print 'iterator get number:', i return i else: raise stopiteration() 例子中的`iterable_range`是一個可迭代物件,所以我們也能夠對它用for語句來進行迭代:
temp = my_range(10) for item in temp: print item, output: my iterator get number:
0 0 my iterator get number: 1 1 my iterator get number: 2 2 my iterator get number:
3 3 my iterator get number: 4 4 my iterator get number: 5 5 my iterator get number:
6 6 my iterator get number: 7 7 my iterator get number: 8 8 my iterator get number:
9 9
大家可以仔細地看一下輸出的日誌:
1. 資料確實是「流式」處理的 2. iterator是真正在背後做事的人 3. `for`語句能夠非常方便的迭代物件的資料。
可迭代物件其實更像是整個 迭代器模式 模式的上層,像一種約束一種契約一種規範,它能夠保證自己能夠返回一個在實際工作中幹活的迭代器物件。 for 、 sum 等接受一個可迭代物件的方法都是遵循這樣的規範:呼叫物件的 __iter__ 函式,返回迭代器,對迭代器物件返回的每個值進行處理抑或需要一些彙總的操作。
拿 for 舉個例子:
iterator_object = iterable_object.__iter__() while true: try:
value = iterator_object.next() except stopiteration: # stopiteration exception is raised after last element break # loop code print value
for 這個語法糖背後的邏輯差不多就是上面例子中**所示的那樣:首先獲取可迭代物件返回的迭代器物件,然後呼叫迭代器物件的 next 方法獲取每個值,在獲取值的過程中隨時檢測邊界-也就是檢查是否丟擲了 stopiteration 這樣的錯誤,如果迭代器物件丟擲錯誤則迭代停止(note:從這個例子可以看出,對於那些接受可迭代物件的方法,如果我們傳一個單純的迭代器物件其實也是無法工作的,可能會報出類似於 typeerror:
iteration over non-sequence 的錯誤)。
當然了,一般在應用過程中我們不會將他們特意的分開,我們能夠稍微對迭代器物件進行修改一下,新增 __iter__ 方法的實現,這樣物件本身就既是可迭代物件也是一個迭代器物件了:
class my_range_iterator: def __init__(self, n): self.
i = 0 self.n = n def __iter__(self): return self def next(self):
if self.i < self.n:
i = self.i self.i += 1 print 'my iterator get number:
', i return i else: raise stopiteration() for item in my_range_iterator(10): print item output:
my iterator get number: 0 0 my iterator get number: 1 1 my iterator get number:
2 2 my iterator get number: 3 3 my iterator get number: 4 4 my iterator get number:
5 5 my iterator get number: 6 6 my iterator get number: 7 7 my iterator get number:
8 8 my iterator get number: 9 9
2樓:匿名使用者
序列,包括字串,列表,元組,集合,字典在內;
迭代器物件(iterator);
生成器函式(generator);
檔案物件。
大學裡的物件靠譜嗎在大學裡找物件到底是臉重要還是身材重要
一般不是不靠譜的問題,而是畢業時現實的問題,大學的學生還有部分找朋友是為了解決寂寞,還有,畢業時分手不是感情多麼好就能維持的,涉及到很多東西,大學時人生價值觀甚至人的性格都會改變很多很多,也許剛開始合適但到最後才發現越來越不合適了,其實還有個原因,就是大多數學生都不懂什麼是真正的愛一個人 就是付出而...
海洋裡哪些可以利用的資源,海洋裡有什麼可利用的資源?
海洋資源利用包括 海洋生物資源 海洋礦產資源 海洋化學資源 海洋空間資源等等。1 海洋食物 僅位於近海水域自然生長的海藻,年產量已相當於目前世界年產小麥總量的15倍以上,如果把這些藻類加工成食品,就能為人們提供充足的蛋白質 多種維生素以及人體所需的礦物質,海洋中還有豐富的肉眼看不見的浮游生物,加工成...
顫包席裡可立至打數字是,顫包席裡可立至打3個數字是
上到什麼時候發貨呀,你是我女朋友的時候可以到什麼時候回來呀!你們那的那個時候我們班男生喜歡我啊,我不知道你是怎麼想的那樣了啊?你打什麼 多少來著你的那個是你好了叫我起床吃飯沒有啊就是我說的就是 顫包席裡可立致打三個數字是多少?你好這位朋友你說的這個問題答案早不是數學,3,8,7。這三個數字呀。氈包席...