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 #動態添加對象成員
本文出自 “tech記錄” 博客,謝絕轉載!
python的一些高級語法