python中的迭代器與生成器

2022-07-29 18:33:06 字數 1901 閱讀 7612

1、迭代器

迭代器協議是指:物件必須提供乙個next方法,執行該方法要麼返回迭代中的下一項,要麼就引起乙個 stopiteration異常,以終止迭代(只能往後走不能往前退)

可迭代物件:實現了迭代器協議的物件(如何實現:物件內部定義乙個_iter_()方法)

協議是一種約定,可迭代物件實現了迭代器協議,python的內部工具(for迴圈,sum,min函式等)使用 迭代器協議訪問物件

2、for迴圈的本質

迴圈所有物件,全都是使用迭代器協議

(字串、列表、元組、集合、檔案物件)這些都不是可迭代物件,只不過在for迴圈時,呼叫了他們內部的 _iter_方法,把他們變成了可迭代物件

然後for迴圈呼叫可迭代物件的_next_方法去取值,而且for迴圈會捕捉stopiteraton異常,以終止迭代。

3.序列型別

字串、列表、元組都有下表,可用index訪問。即可以用while迴圈 但非序列型別:字典、集合、檔案物件無法用index訪問,所以用for。

for迴圈就是基於迭代器協議提供了乙個統一的可以遍歷所有物件的方法,即在遍歷之前,先呼叫物件的 _iter_方法將其轉換成乙個迭代器,

然後使用迭代器協議去實現迴圈訪問,這樣所有的物件就都可以通過for迴圈遍歷了。

4 生成器

4.1一種資料型別,這種資料型別自動實現迭代器協議(其他的資料型別需要呼叫自己的_iter_方法),所以生成器就是可迭代物件。

4.2生成器在python中有兩種不同的表達方式

(1)生成器函式

def test():

yield 1

yield 2

yield 3

g=test() # 不需要呼叫_iter_方法

print(g.__next__())

print(g.__next__())

print(g.__next__())

(1)生成器表示式

三元表示式

# name='alex'

name='linhf'

res='sb' if name == 'alex' else '帥哥' (if name == 'alex'是一元,res='sb'是二元,else '帥哥' 是三元)

print(res)

列表解析

egg_list=

for i in range(10):

'雞蛋%s

'%i)

print

(egg_list)

可以改寫為

l=['

雞蛋%s

'%i for i in range(10)]

print(l)

laomuji=('

雞蛋%s

'%i for i in range(10)) #

生成器表示式

print

(laomuji)

print(laomuji.__next__

())print(laomuji.__next__

())print(laomuji.__next__

())print(laomuji.__next__())

4.3 總結

(1)把列表解析的[ ]換成()得到的就是生成器表示式

(2)列表解析與生成器表示式都是一種便利的程式設計方式,只不過生成器表示式更節省記憶體

(3)python不但使用迭代器協議,讓for迴圈變得更加通用,大部分內建函式,也是使用迭代器協議訪問物件的。例如,sum函式是python的內建函式,該函式使用迭代器協議訪問物件,而生成器實現了迭代器協議。

python中的迭代器與生成器

實現乙個迭代器,應滿足如下條件 簡單示例 usr bin env python class sampleiter sample iterator sampleiter sampleiter sampleiter.next a sampleiter.next b sampleiter.next tra...

python中的迭代器與生成器

有 iter 方法的就是可迭代物件 列舉些可迭代物件 str,list,tuple,dict,set,range,檔案控制代碼 獲取乙個物件的所有的方法dir 把每個方法以字串的格式放在乙個列表中返回回來 s1 asdfas print dir s1 結果 add class contains de...

Python生成器與迭代器

生成器只有在用的時候會出現在記憶體中,對比列表全部存在記憶體中,減少了記憶體占用 next 函式 依次取生成器的值 s x 2 for x in range 1000 中括號是列表解析,小括號表示生成一系列值,就是生成器 s at 0x7fa20aa8b048 print next s 用next ...