迭代器是python乙個強大的功能,它可以記錄被迭代「物件」的位置,迭代器物件從集合的第乙個元素開始訪問資料,直到所有資料訪問結束,迭代器有兩個基本函式iter()和next()
iter()用來生成迭代器
next()用來返回迭代器的下乙個資料
python內建模組itertools,提供了很多非常有用的函式。另外,迭代器結合生成器和閉包使用可以寫出優雅的**。
舉例:列表有100個數字,每次取10個數字列印
import itertools
def grouper(iterable, size):
it = iter(iterable)
while true:
chunk = tuple(itertools.islice(it, size))
if not chunk:
return
yield chunk
data = [i for i in range(100)]
for group in grouper(data, 10):
print group
我們看一下執行結果,對就是這麼神奇!
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
(10, 11, 12, 13, 14, 15, 16, 17, 18, 19)
(20, 21, 22, 23, 24, 25, 26, 27, 28, 29)
(30, 31, 32, 33, 34, 35, 36, 37, 38, 39)
(40, 41, 42, 43, 44, 45, 46, 47, 48, 49)
(50, 51, 52, 53, 54, 55, 56, 57, 58, 59)
(60, 61, 62, 63, 64, 65, 66, 67, 68, 69)
(70, 71, 72, 73, 74, 75, 76, 77, 78, 79)
(80, 81, 82, 83, 84, 85, 86, 87, 88, 89)
(90, 91, 92, 93, 94, 95, 96, 97, 98, 99)
這裡有個問題需要特別注意
迭代器在通過while表示式訪問時,要注意捕獲stopiteration異常,通過for表達訪問時則不需要
data1 = iter([i for i in range(2)])
for d1 in data1:
print 'data1 em = ', d1
data2 = iter([i for i in range(2, 4)])
while true:
d2 = next(data2)
print 'data2 em = ', d2
print 'ok'
執行上面**,會丟擲stopiteration異常
data1 em = 0
traceback (most recent call last):
data1 em = 1
data2 em = 2
file "/users/zhangmingliang/pycharmprojects/jianshu/generator.py", line 8, in
data2 em = 3
d2 = next(data2)
stopiteration
重構**,捕獲stopiteration異常
data1 = iter([i for i in range(2)])
for d1 in data1:
print 'data1 em = ', d1
data2 = iter([i for i in range(2, 4)])
while true:
try:
d2 = next(data2)
print 'data2 em = ', d2
except stopiteration:
print 'no data'
break
print 'ok'
**執行正常
data1 em = 0
data1 em = 1
data2 em = 2
data2 em = 3
no data
ok那麼有哪些物件是可迭代的呢?
除了python內建的字串、列表、元組、字典和檔案等資料結構。我們可以自定義實現迭代物件,只要物件實現了iter()和next()兩個方法,就可以被迭代訪問
class myiter(object):
def __init__(self, total, start=0):
self.total = total
self.start = start
def __iter__(self):
return self
def next(self):
if self.start < self.total:
self.start += 1
return self.start
else:
raise stopiteration
myiter = myiter(5)
it = iter(myiter)
for d in it:
print d
輸出結果:
總結通過自定義迭代物件的**我們可以看到,next()函式可以實現資料的懶載入,這個特性在大批量資料處理場景中非常有用,可以節省大量的記憶體占用並且提高程式效能
迭代器 反向迭代器
c primer 中文版第四版 第273頁 9.3.2 begin和end成員 begin和end操作產生指向容器內第乙個元素和最後乙個元素的下乙個位置的迭代器,如下所示。這兩個迭代器通常用於標記包含容器中所有元素的迭代範圍。c.begin 返回乙個迭代器,它指向容器c的第乙個元素 c.end 返回...
迭代器 可迭代物件 迭代器物件
今天的學習內容有 迭代器 可迭代物件 迭代器物件 for迴圈內部原理 生成器和生成器表示式 面向過程程式設計 迭代就是指更新換代的過程,要重複進行,而且每次的迭代都必須基於上一次的結果。我們使用for迴圈的時候就是把元素從容器裡乙個個取出來,這種過程其實就是迭代。迭代器 迭代取值的工具。迭代器的作用...
C STL迭代器 插入迭代器
include stdafx.h include include include include include 演算法庫對所有在容器上的操作有個承諾 決不修改容器的大小 不插入 不刪除 有了插入迭代器,既使得演算法庫可以通過迭代器對容器插入新的元素,又不違反這一承諾,即保持了設計上的一致性。usi...