for迴圈遍歷的原理
for迴圈遍歷的原理就是迭代,in後面必須是可迭代物件
為什麼要有迭代器
對於序列型別:字串、列表、元組,我們可以使用索引的方式迭代取出其包含的元素。但對於字典、集合、檔案等型別是沒有索引的,若還想取出其內部包含的元素,則必須找出一種不依賴於索引的迭代方式,這就是迭代器
1.可迭代物件
有__iter__
方法的物件,都是可迭代物件,有以下6種
可迭代的物件:python內建str、list、tuple、dict、set、file都是可迭代物件
"zx".__iter__()
["zx"].__iter__()
.__iter__()
("zx",).__iter__()
.__iter__()
with open("prize.txt","r") as file:
file.__iter__()
2.迭代器物件
1.可迭代的物件執行__iter__
方法得到的返回值是迭代器物件。2.迭代器物件指的是即內建有__iter__
又內建有__next__
方法的物件
list=[1,2,3,4,5,6]
zx=list.__iter__()
while true:
try:
print(zx.__next__())
except:
break
檔案型別是迭代器物件
open('a.txt').__iter__()
open('a.txt').__next__()
迭代器物件一定是可迭代物件,而可迭代物件不一定是迭代器物件
生成器就是一種迭代器。迭代器有乙個特點就是可以被next()函式呼叫並不斷返回下乙個值的物件,並且只能迭代它們一次。原因很簡單,因為它們不是全部存在記憶體裡,它們只在要呼叫的時候在記憶體裡生成。
生成器就是迭代器(函式返回的結果就是生成器,而且它同時有__iter__
和__next__
)
def zx():
yield 1
yield 2
x=zx()
x.__next__()
x.__iter__()
實驗室
每次__next__
之後,會執行到相應的yield不會執行下面的內容。
為啥?這個實驗執行了呢,因為用了for,他不知道最後執行到**,他就會一直__next__
,直到最後丟擲異常,然而for in裡面自帶捕獲異常的內容,所有沒有列印異常資訊。
def func():
yield [1,1,23] # yield會使函式func()變成生成器物件,因此他就具有__iter__方法
print(789) # yield會停止函式,當執行下一次next才會繼續執行下面的**
yield 101112 # 乙個yield對應乙個next
print(131415)
g = func()
for i in g:
print(i)
[1, 1, 23]
789101112
131415
關於迭代器和和生成器的區別
生成器是一種特殊的迭代器,生成器實現了迭代器協議--iter--,--next--
生成器是可以改變迭代的值的,然而迭代器隨意改值會有問題
生成器需要自己處理最後沒有迭代值的異常stopiteration
,普通迭代器已經預設實現
關於迭代器和list的區別
list直接把所有資料載入到記憶體
而迭代器是乙個乙個取值,在需要下乙個值的時候才回去計算取出這個值到記憶體(可以把迭代器想象成乙個生成器的**,一次next,執行下面的**,然後返回值)
關於迭代器深入的資訊可以檢視大佬部落格
生成器和迭代器
可以直接作用於for迴圈的物件稱為可迭代物件 iterable.可以用isinstance 判斷乙個物件是否是iterable物件。isinstance iterable true isinstance iterable true isinstance 235,iterable false 而生成器...
迭代器和生成器
1 迭代器的概念 print dir 告訴我列表的所有用法 有雙下劃線的所有方法叫做雙下方法,是c語言已經寫好的方法。你可以用不止一種方法呼叫它。列表的用法變集合 set dir 求交集 set dir set dir set dir 求列表,字典,字串它們的用法的交集 他們共同的用法 iterab...
生成器和迭代器
1.iterator 迭代器 舉例 我們對list使用for for i in 1,2,3,4 print i 12 34對string物件使用for for ch in python print ch py thon對字典物件使用for for k in print k yx對檔案使用for fo...