1 迭代器 (iterator)
迭代器是訪問集合元素的一種方式,迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退,不過這也沒什麼,因為人們很少在迭代途中往後退。
迭代器的好處是,迭代器在返回資料的時候是每次返回集合中的乙個元素,而不是一次將所有的元素全部提取到記憶體中,這樣節約記憶體。特別是在提取比較大的檔案時,更能體現迭代器的優勢。
迭代器可使用內建的iter方法建立,見例子:
>>> i = iter('abc')
>>> i.next()
'a'>>> i.next()
'b'>>> i.next()
'c'>>> i.next()
traceback (most recent call last):
file "", line 1, in stopiteration:
獲取迭代器元素是,可以呼叫內建的next方法獲取,但python處理迭代器越界會丟擲stopiteration異常。也可以使用for迴圈來獲取迭代器元素,在for迴圈中,python將自動呼叫工廠函式iter()獲得迭代器,自動呼叫next()獲取元素,還完成了檢查stopiteration異常的工作上面說的都是python自帶的容器物件,它們都實現了相應的迭代器方法,那如果是自定義類需要遍歷怎麼辦。這裡要用到下面的功能生成器
a = iter(['1','2','3','4'])
print(a.value)
for i in range(4):
print(a.__next__())
2.生成器 generator
我們在傳統的定義函式時,返回值都是使用return,這樣對於要返回乙個集合都是將集合全部生成完成後一次返回。如果我們要實現乙個迭代器時,就要通過yield返回,這樣就實現了乙個生成器,看下面的例子:
def get_money(account):
while account > 0:
account -= 100
yield 100
print("取出100塊")
a2 = get_money(500)
print(a2.__next__())
print('came back again!')
print(a2.__next__())
結果:第一次: 100
came back again!
取出100塊
第二次 100
從上面例子看出,當使用yield返回結果時,不是一次將最後的結果全部返回,而是先返回乙個值,當再次呼叫next方法取值時,將接著上一次返回結果的地方接著執行。
我們使用yield不僅可以從函式的迴圈中一次乙個的返回值,也可以在迴圈的過程中接收外界的值,這個是非常cool的。看下面的例子:
def consumer(name):
while true:
in_com = yield
print("%s get the value %s" % (name,in_com))
def producers():
a1 = consumer('a')
a2 = consumer('b')
a1.__next__()
a2.__next__()
while true:
for i in range(5):
a1.send(str(i))
a2.send(str(i))
break
producers()
結果:a get the value 0
b get the value 0
a get the value 1
b get the value 1
a get the value 2
b get the value 2
a get the value 3
b get the value 3
a get the value 4
b get the value 4
以上**其實實現了乙個同步的執行非同步效果。
檔案讀取的迭代實現
我們知道使用open讀取檔案時,有read方法讀取全部內容,如果檔案大小是g級別的,這將非常消耗記憶體,我們可以使用下面的方法讀取檔案:
with open('files.txt','r') as f:
for line in f:
print(line)
這樣可以採用迭代的方式每次從檔案中讀取一行,節省記憶體 Python之生成器 迭代器
利用 建立generator a x x for x in range 10 列表生成式 a 0,1,4,9,16,25,36,49,64,81 b x x for x in range 10 用 建立乙個generator b at 0x7f62455db258 next b 利用 next 呼叫...
python之迭代器 生成器
迭代器 迭代器是訪問集合元素的一種方式。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器提供了統一的訪問集合的介面,只要定義 iter 方法物件,就可以使用迭代器訪問。迭代器有兩個基本的方法 iter 方法 返回迭代器物件本身 按我自己比較土的理解方法就是,每呼叫一次iter...
Python之生成器 迭代器
生成器類似返回值為陣列的乙個函式,這個函式可以接受引數,可被呼叫,但只能產生乙個值,所以大大節省記憶體。生成器表示式的語法非常簡單,只需要將列表推導式的中括號改成小括號就可以了 1 x x for x in range 10 if x 2 0 會列印出整個列表 0,4,8,12,16 1 x x f...