迭代器與生成器

2022-02-26 21:31:21 字數 2495 閱讀 8881

迭代器的概念

#迭代器即迭代的工具,那什麼是迭代呢?

#迭代是乙個重複的過程,每次重複即一次迭代,並且每次迭代的結果都是下一次迭代的初始值

while true: #只是單純地重複,因而不是迭代

print('===>')

l=[1,2,3]

count=0

while count < len(l): #迭代

print(l[count])

count+=1

為什麼要有迭代器?什麼是可迭代物件?什麼是迭代器物件?

#1、為何要有迭代器?

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

#2、什麼是可迭代物件?

可迭代物件指的是內建有__iter__方法的物件,即obj.__iter__,如下

'hello'.__iter__

(1,2,3).__iter__

[1,2,3].__iter__

.__iter__

.__iter__

open('a.txt').__iter__

#3、什麼是迭代器物件?

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

而迭代器物件指的是即內建有__iter__又內建有__next__方法的物件

檔案型別是迭代器物件

open('a.txt').__iter__()

open('a.txt').__next__()

#4、注意:

迭代器物件一定是可迭代物件,而可迭代物件不一定是迭代器物件

迭代器物件的使用

dic=

iter_dic=dic.__iter__() #得到迭代器物件,迭代器物件即有__iter__又有__next__,但是:迭代器.__iter__()得到的仍然是迭代器本身

iter_dic.__iter__() is iter_dic #true

print(iter_dic.__next__()) #等同於next(iter_dic)

print(iter_dic.__next__()) #等同於next(iter_dic)

print(iter_dic.__next__()) #等同於next(iter_dic)

# print(iter_dic.__next__()) #丟擲異常stopiteration,或者說結束標誌

#有了迭代器,我們就可以不依賴索引迭代取值了

iter_dic=dic.__iter__()

while 1:

try:

k=next(iter_dic)

print(dic[k])

except stopiteration:

break

#這麼寫太醜陋了,需要我們自己捕捉異常,控制next,python這麼牛逼,能不能幫我解決呢?能,請看for迴圈

使用for迴圈迴圈迭代器物件

#基於for迴圈,我們可以完全不再依賴索引去取值了

dic=

for k in dic:

print(dic[k])

#for迴圈的工作原理

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

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

#3: 重複過程2,直到捕捉到異常stopiteration,結束迴圈

迭代器的優缺點

#優點:

- 提供一種統一的、不依賴於索引的迭代方式

- 惰性計算,節省記憶體

#缺點:

- 無法獲取長度(只有在next完畢才知道到底有幾個值)

- 一次性的,只能往後走,不能往前退,也就是說,每一次的迴圈會把物件裡的元素一次性迴圈完畢

生成器概念

#只要函式內部包含有yield關鍵字,那麼函式名()的到的結果就是生成器,並且不會執行函式內部**

def func():

print('====>first')

yield 1

print('====>second')

yield 2

print('====>third')

yield 3

print('====>end')

g=func()

print(g) #

生成器是特殊的迭代器

g.__iter__

g.__next__

#2、所以生成器就是迭代器,因此可以這麼取值

res=next(g)

print(res)

相比於迭代器,生成器的好處在於它不會一次性生成所有被迴圈的元素,而是取一次而生成乙個元素,這樣可以減少對記憶體和cup的使用。

迭代器與生成器

可迭代物件 可以直接作用於for迴圈的物件 統稱為可迭代物件 返回迭代器的物件 即iterable。一是集合資料型別,如list tuple dict set str等 二是generator,包括生成器和帶yield的generator function。容器 簡單來說 容器是一系列元素的集合 容...

生成器與迭代器

迭代是python最強大的功能之一,是訪問集合元素的一種方式。迭代器是乙個可以記住遍歷的位置的物件。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。迭代器有兩個基本的方法 iter 和 next 字串,列表或元組物件都可用於建立迭代器 list 1,2,3,...

生成器與迭代器

通過列表推導式,可以直接建立乙個列表,但是收到記憶體限制,列表容量肯定是有限的而且,建立乙個包含100萬個元素的列表,占用很大的儲存空間。如果我們僅僅需要訪問前面幾個元素,後面 後面元素的占用儲存空間就被浪費 所以,如果列表元素可以按照某種演算法算出來,那我們就可以再迴圈當中不斷地推導它,生成元素,...