4 3(迭代器,迭代器物件,生成器,列舉物件)

2021-09-19 01:25:47 字數 3170 閱讀 9672

器:包含多個值的容器。

迭代:迴圈反饋(一次從容器中取出乙個值)。

迭代器:從裝有多個值的容器中一次取出乙個值給外界。迴圈反饋的容器,不同於索引取值,但也可以從容器物件從前往後逐個返回內部的值。

迭代是乙個重複的過程,每次重複就為一次迭代,每次迭代的結果都是下一次迭代的初始值。

優點:不能依賴索引,完成取值。

缺點:不能計算長度,不能指定位取值(只能從前往後逐一取值)。

ls = [1,2,3,4,5]

# 遍歷:被遍歷的物件那必須是有序容器

i = 0

while i < len(ls):

print(ls[i])

i += 1

for v in 'abc'.__iter__():

print(v)

for k, v in .itms()

print(k)

with open('abc.txt', 'r', encoding = 'utf-8') as f:

for line in f:

print(line)

為何要有迭代器:對於有序序列:字串,列表,元組,我們可以使用索引的方式迭代取出其包含的元素。但對於字典,集合,檔案等型別是沒有索引的,若還想取出其內部包含的元素,則必須找出一種不依賴索引的迭代方式,這就是迭代器。

可迭代物件:

可迭代物件指內建有_ _ iter _ _方法的物件,即obj. _ _ iter _ _.

str | list | tuple | dict |set | range() | file |enumtera | 迭代器物件 | 生成器

迭代器物件

可迭代物件執行obj. _ _ iter _ _()得到的結果就是迭代器物件:

迭代器物件指既內建有 _ _ iter _ _又內建有 _ _next _ _方法的物件。

迭代器物件有:file | enumerate() | 生成器

注意:迭代器物件一定時可迭代物件,而可迭代物件不一定是迭代器物件。

重點

1.從迭代器物件中取元素,取乙個少乙個,如果從頭開始,需要重新獲得擁有所有元素的迭代器物件。

2.迭代器物件也有 _ _iter _ _()方法,呼叫後得到自己本身

# 迭代器物件的使用

dic =

iter_dic = dic.__iter__()

# iter_dic = dic.__iter__()

while 1:

try:

k = next(ier_dic)

print(dic[k])

except stopiteration:

break

for 迴圈

dic = 

for k in dic:

print(dic[k])

1:執行in後物件的dic. _ _ iter _ _()方法,得到乙個迭代器物件iter_dic

2.執行next (iter_dic),將得到的值賦給k,然後執行迴圈體**

3.重複過程2,直到捕捉到異常stopiternation,結束迴圈。

(1.自動獲取被迭代物件的迭代器物件

2.在內部一次一次呼叫 _ _ next _ _ ()方法取值

3.自動完成異常處理

with open('abc.txt', 'r',encoding = 'utf-8') as f:

print(f.__next__())

print(f.__next__())

print(f.__next__())

迭代器的優缺點:

優點:(提供一種統一的,不依賴索引的迭代方式,惰性計算,節省記憶體)

缺點:(無法獲取長度,一次性的,只能往後走,不能往前退)

生成器:就是乙個迭代器物件

包含yiled關鍵字的函式就是生成器

該函式名()得到的是生成器物件,且不會執行函式體

工作原理:

1.獲取可迭代物件的迭代器物件

2.迴圈__next__()取值

3.異常處理(stopiteration),停止迭代

def fn()

print('我是生成器')

yiled 'god'

generator_obj.__iter__() # 可迭代物件

generator_obj.__next__() # 迭代器物件

生成器應用案例

當訪問的資料資源過大,可以將資料用生成器處理,一次只獲取所有內容的一條資源

def my_range(min, max=0, step=1):

if max == 0:

min ,max = max,min

tag = min

while true:

if tag >= max:

break

yiled tag

tag += step

range_obj = my_range()

print(range_obj.__next__())

print(range_obj.__next__())

倒敘遍歷

range_obj = my_range(5, 10, 2)

for i in range_obj:

print(i)

利用send()方法給yield關鍵字傳值,內部接收yield關鍵字可以得到傳入的值。

def func():

rev1 = yield 1000

print(rev1)

yield 2000

obj = func()

r1 = obj.__next__()

print(r1)

r2 = obj.send('資訊1')

print(r2)

通過enumerate()方法,可以為可迭代物件生成索引迭代,其本身也是乙個迭代器物件。

ls = [1,3,5,7,9]

for i, v in enumerate(ls):

print(i,v)

迭代器和迭代物件 生成器

iterator 迭代器物件,必須要實現 next 魔法函式 iterable 可迭代物件,繼承 iterator,必須要實現 iter 魔法函式 迭代器 iterator 與可迭代物件 iterable 的區別 生成器生成器 函式中只要有 yield,這個函式就會變成生成器。每次執行到 yield...

可迭代物件,生成器,迭代器

classa def init self self.count 10def iter self print 執行 iter return self def next self print 執行 next if self.count 0 self.count 1return self.count el...

迭代器 可迭代物件 生成器

先上本文主題 迭代器一定是可迭代物件,可迭代物件不一定是迭代器 可迭代物件要滿足什麼條件才能使用 for 正確遍歷 生成器一定是迭代器.是否為迭代器 isinstance t,iterator 是否為可迭代物件 isinstance t,iterable 實現了 iter 魔法方法,就是可迭代物件....