項(xiàng)目地址:https:///pytips 迭代器與生成器 迭代器(iterator)與生成器(generator)是 Python 中比較常用又很容易混淆的兩個(gè)概念,今天就把它們梳理一遍,并舉一些常用的例子。 for 語(yǔ)句與可迭代對(duì)象(iterable object):
這些可以用在 for 語(yǔ)句進(jìn)行循環(huán)的對(duì)象就是可迭代對(duì)象。除了內(nèi)置的數(shù)據(jù)類(lèi)型(列表、元組、字符串、字典等)可以通過(guò) for 語(yǔ)句進(jìn)行迭代,我們也可以自己創(chuàng)建一個(gè)容器,包含一系列元素,可以通過(guò) for 語(yǔ)句依次循環(huán)取出每一個(gè)元素,這種容器就是迭代器(iterator)。除了用 for 遍歷,迭代器還可以通過(guò) next() 方法逐一讀取下一個(gè)元素。要?jiǎng)?chuàng)建一個(gè)迭代器有3種方法,其中前兩種分別是:
創(chuàng)建迭代器對(duì)象的好處是當(dāng)序列長(zhǎng)度很大時(shí),可以減少內(nèi)存消耗,因?yàn)槊看沃恍枰涗浺粋€(gè)值即刻(經(jīng)??吹饺藗兘榻B Python 2.7 的 range 函數(shù)時(shí),建議當(dāng)長(zhǎng)度太大時(shí)用 xrange 更快,在 Python 3.5 中已經(jīng)去除了 xrange 只有一個(gè)類(lèi)似迭代器一樣的 range)。 生成器 前面說(shuō)到創(chuàng)建迭代器有3種方法,其中第三種就是生成器(generator)。生成器通過(guò) yield 語(yǔ)句快速生成迭代器,省略了復(fù)雜的 __iter__() & __next__() 方式:
簡(jiǎn)單來(lái)說(shuō),yield 語(yǔ)句可以讓普通函數(shù)變成一個(gè)生成器,并且相應(yīng)的 __next__() 方法返回的是 yield 后面的值。一種更直觀的解釋是:程序執(zhí)行到 yield 會(huì)返回值并暫停,再次調(diào)用 next() 時(shí)會(huì)從上次暫停的地方繼續(xù)開(kāi)始執(zhí)行:
Python 3.5 (準(zhǔn)確地說(shuō)應(yīng)該是 3.3 以后)中為生成器添加了更多特性,包括 yield from 以及在暫停的地方傳值回生成器的 send()等,為了保持簡(jiǎn)潔這里就不深入介紹了,有興趣可以閱讀官方文檔說(shuō)明以及參考。 參考
|
|
來(lái)自: River_LaLaLa > 《Python》