python系列之 迭代器 生成器

2021-07-09 14:16:07 字數 2308 閱讀 8502

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...