1. 程式人生 > >Python3:生成器在UserList應用原理

Python3:生成器在UserList應用原理

大家一定記得 list 是可以用for迴圈,具體怎麼實現的呢,
這是本節的重點.

例如:

a=[1,2,3]

for i in a:
    print(i)

我在之前的章節也講到 , 類變成可迭代的物件 需要完成兩個方法的任意一個,

  1. 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

以上的程式碼很簡單,如果你看過我前面的章節,一定能看懂.

那我就再稍微的解釋下 .

  1. i代表是 物件的下標(getitem 會返回一個迭代物件)
  2. v代表取到的值
  3. yield v 表示會把值儲存在生成器.
  4. 如果報錯,會返回生成器.
  5. 當for 迴圈呼叫next()的時候就是取到 while 每一次儲存的V
    謝謝大家的瀏覽,有好的建議或者寫錯的地方請在下邊評論留言 ,謝謝