Python yield 使用淺析(轉載)

Python yield 使用淺析

轉載http://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/python

如下是理解概括app

###如何生成斐波那契數列ide

def fab(max): 
	n, a, b = 0, 0, 1 
	while n < max: 
    	print b 
    	a, b = b, a + b 
    	n = n + 1

執行函數

fab(5)

問題是print太多了code

解決問題,用list一次打出來

def fab(max): 
	n, a, b = 0, 0, 1 
	L = [] 
	while n < max: 
    	L.append(b) 
    	a, b = b, a + b 
    	n = n + 1 
	return L

問題是若是max很大,那麼L就很大,佔內存對象

解決佔內存問題(經過 iterable 對象來迭代)

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

iterable每次只佔next的時候的內存get

問題:感受代碼太多,沒有初版的 fab 函數來得簡潔generator

使用yield,代碼就簡潔了

def fab(max): 
	n, a, b = 0, 0, 1 
	while n < max: 
    	yield b 
    	# print 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。

其餘概括

(iterable和generator)通常不會手動的調用next方法,而使用for循環,若是一直使用next,當到最後一個沒有的時候,就會拋異常;

有yield的時候,由於yield至關於另外的返回值,不能直接return具體值(不過在3.0以後的python就能夠在yield以前return一個值),會拋SyntaxError: 'return' with argument inside generator 異常

相關文章
相關標籤/搜索