python的一些高級語法

1.python 可迭代對象的寫法

a.循環版-迭代器

通過實現類的屬性方法實現

class Fab(object): 


    def __init__(self, max): 

        self.max = max 

        self.n, self.a, self.b = 0, 0, 1 


    def __iter__(self):   //返回迭代屬性

        return self 


    def next(self):       //實現迭代方法

        if self.n < self.max: 

            r = self.b 

            self.a, self.b = self.b, self.a + self.b 

            self.n = self.n + 1 

            return r 

        raise StopIteration()


>>> for n in Fab(5): 

 ...     print n 

 ... 

遍歷結束時拋出StopIteration異常

iter = (x**2 for x in rang(10) if x%2==0)生成迭代器,相當於yield

list = [x**2 for x in rang(10) if x%2==0]  生成列表

b.yield - 生成器(也屬於迭代器:由解釋器自動生成的迭代器,有助於保持代碼簡潔)

 def fab(max): 

    n, a, b = 0, 0, 1 

    while n < max: 

        yield b 

        a, b = b, a + b 

        n = n + 1 


 >>> for n in fab(5): 

 ...     print n 

 ... 


yield 的作用就是把一個函數變成一個 generator,帶有 yield 的函數不再是一個普通函數,Python 解釋器會將其視爲一個 generator,調用 fab(5) 不會執行 fab 函數,而是返回一個 iterable 對象!在 for 循環執行時,每次循環都會執行 fab 函數內部的代碼,執行到 yield b 時,fab 函數就返回一個迭代值,下次迭代時,代碼從 yield b 的下一條語句繼續執行,而函數的本地變量看起來和上次中斷執行前是完全一樣的,於是函數繼續執行,直到再次遇到 yield。也可以手動調用 fab(5) 的 next() 方法(因爲 fab(5) 是一個 generator 對象,該對象具有 next() 方法)

 >>> f = fab(5) 

 >>> f.next() 

要注意區分 fab 和 fab(5),fab 是一個 generator function,而 fab(5) 是調用 fab 返回的一個 generator,好比類的定義和類的實例的區別

在一個 generator function 中,如果沒有 return,則默認執行至函數完畢拋出 StopIteration ,如果在執行過程中 return,則直接拋出 StopIteration 終止迭代。


另一個 yield 的例子來源於文件讀取。如果直接對文件對象調用 read() 方法,會導致不可預測的內存佔用。好的方法是利用固定長度的緩衝區來不斷讀取文件內容。通過 yield,我們不再需要編寫讀文件的迭代類,就可以輕鬆實現文件讀取:

 def read_file(fpath): 

    BLOCK_SIZE = 1024 

    with open(fpath, 'rb') as f: 

        while True: 

            block = f.read(BLOCK_SIZE) 

            if block: 

                yield block 

            else: 

                return

生成器或迭代器相比於列表可以更大限度的減小內存的開銷

for line in open("test.txt"):   #use file iterators

    print line

能節省內存的地方就應該是用生成器(速度快,節省內存)

2.動態添加對象成員

class Info():

def __init__(self):

self.a=10

>>info = Info()

>>info.b=20

>>print info.b   #動態添加對象成員


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章