Python3:生成器在UserList應用原理
阿新 • • 發佈:2018-11-19
大家一定記得 list 是可以用for迴圈,具體怎麼實現的呢,
這是本節的重點.
例如:
a=[1,2,3]
for i in a:
print(i)
我在之前的章節也講到 , 類變成可迭代的物件 需要完成兩個方法的任意一個,
- iter , 2.getitem
就可以進行for迴圈進行遍歷.
這到底原理是什麼呢 ?
我們先看下邊的程式碼:
class A: def __iter__(self): pass def __getitem__(self, item): pass a=A() for i in a: print(i)
實際for迴圈 裡暗藏了一個 iter()函式, 會找 class A的 iter, 如果找不到 會退而求其次,
去找 模擬的__iter__函式 ,例如上邊的是 getitem
我們會發現 關鍵點還是在__ iter__ 函式 . 為了追求真理我們必須剖析找個函式.
注意 我們不能直接檢視 list原始碼 ,不信你可以試試,因為它是C 語言寫的,同樣也不能繼承
那怎麼辦呢,難不倒強大的python
可以用UserList , 它是python 的方式去解釋List .
先開啟 UserList :
from collections import UserList
開啟後我們看到 它繼承了MutableSequence ,繼續開啟MutableSequence
lass UserList(MutableSequence):
MutableSequence 繼承 Sequence (序列)
class MutableSequence(Sequence):
繼續開啟 Sequence ,終於找到了重寫的 iter
class Sequence(Reversible, Collection): @abstractmethod def __getitem__(self, index): raise IndexError def __iter__(self): i = 0 try: while True: v = self[i] yield v i += 1 except IndexError: return
以上的程式碼很簡單,如果你看過我前面的章節,一定能看懂.
那我就再稍微的解釋下 .
- i代表是 物件的下標(getitem 會返回一個迭代物件)
- v代表取到的值
- yield v 表示會把值儲存在生成器.
- 如果報錯,會返回生成器.
- 當for 迴圈呼叫next()的時候就是取到 while 每一次儲存的V
謝謝大家的瀏覽,有好的建議或者寫錯的地方請在下邊評論留言 ,謝謝