1. 程式人生 > >python的一些高級語法

python的一些高級語法

python return

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的一些高級語法