迭代器的概念
#迭代器即迭代的工具,那什麼是迭代呢?#迭代是乙個重複的過程,每次重複即一次迭代,並且每次迭代的結果都是下一次迭代的初始值
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萬個元素的列表,占用很大的儲存空間。如果我們僅僅需要訪問前面幾個元素,後面 後面元素的占用儲存空間就被浪費 所以,如果列表元素可以按照某種演算法算出來,那我們就可以再迴圈當中不斷地推導它,生成元素,...