迭代 生成
for循環遍歷的原理
for循環遍歷的原理就是迭代,in後面必須是可迭代對象
爲什麼要有迭代器
1.可迭代對象
有__iter__
方法的對象,都是可迭代對象,有以下6種
可迭代的對象:Python內置str、list、tuple、dict、set、file都是可迭代對象
2.迭代器對象
1.可迭代的對象執行__iter__
方法得到的返回值是迭代器對象。2.迭代器對象指的是即內置有__iter__
又內置有__next__
方法的對象
文件類型是迭代器對象
迭代器對象一定是可迭代對象,而可迭代對象不一定是迭代器對象
生成器
生成器就是一種迭代器。迭代器有一個特點就是可以被next()函數調用並不斷返回下一個值的對象,並且只能迭代它們一次。原因很簡單,因爲它們不是全部存在內存裏,它們只在要調用的時候在內存裏生成。
生成器就是迭代器(函數返回的結果就是生成器,而且它同時有__iter__
和__next__
)
x._next()
x._iter()
實驗室
每次__next__
之後,會執行到相應的yield不會執行下面的內容。
爲啥?這個實驗執行了呢,因爲用了for,他不知道最後執行到哪裏,他就會一直__next__
,直到最後拋出異常,然而for in裏面自帶捕獲異常的內容,所有沒有打印異常信息。
g = func()
for i in g:
print(i)
[1, 1, 23]
789
101112
131415
關於迭代器和和生成器的區別
生成器是一種特殊的迭代器,生成器實現了迭代器協議--iter--,--next--
生成器是可以改變迭代的值的,然而迭代器隨意改值會有問題
關於迭代器和list的區別
list直接把所有數據加載到內存
而迭代器是一個一個取值,在需要下一個值的時候纔回去計算取出這個值到內存(可以把迭代器想象成一個生成器的代碼,一次next,運行下面的代碼,然後返回值)
關於迭代器深入的信息可以查看大佬博客
https://www.cnblogs.com/deeper/p/7565571.html