標籤:

Python學習筆記 ——yield

經常看到大神寫程序中使用yield,一直不明白這個的用法,現在好好記錄下。

1、迭代器

迭代器是訪問集合內元素的一種方式。迭代器對象從集合的第一個元素開始訪問,直到所有元素都被訪問一遍後結束。迭代器不能回退,只能向前進行迭代。

Python中最常使用迭代器的場景是循環語句 for

>>> for i in range(5): #range返回一個列表ntprint inntn0n1n2n3n4n

其中的range()返回一個包含所有指定元素的集合,而for語句將其封裝成一個迭代器後訪問。使用iter()調用可以將列表、集合轉換為迭代器。

>>> a = [1,3,5,7,9]n>>> t = iter(a)n>>> print tn<list_iterator object at 0x0000000003435240>n

代碼中t即迭代器。

迭代器與普通Python對象的區別是迭代器有一個next()方法,每次調用該方法可以返回一個元素。調用者(比如for語句)可以通過不斷調用next()方法來組個訪問幾何元素。

>>> iter = iter(range(5))n>>> print iter.next()n0n>>> print iter.next()n1n>>> print iter.next()n2n>>> print iter.next()n3n>>> print iter.next()n4n>>> print iter.next()nnTraceback (most recent call last):n File "<pyshell#6>", line 1, in <module>n print iter.next()nStopIterationn

註:Python3中用法不一樣.

2、使用yield

迭代器在Python中應用很廣,開發者可以使用yield定製自己的迭代器。

# -*- coding:utf-8 -*-nndef demoIterator():n print "Im in the first call of next()"n yield 1n print "Im in the second call of next()"n yield 3n print "Im in the third call of next()"n yield 9nnnfor i in demoIterator():n print in

結果為

Im in the first call of next()n1nIm in the second call of next()n3nIm in the third call of next()n9n

每次調用迭代器的next()函數,將會執行迭代器函數,並返回yield的結果作為迭代返回元素。當迭代器函數return時,迭代器會拋出StopIteration 異常使迭代終止。

技巧:在Python中,使用yield關鍵字定義的迭代器也被成為「生成器」。

3、實例

說了那麼多太抽象,舉例來看看。

yield 實現Fibonacci數列(斐波那契數列

斐波那契數列指的是這樣一個數列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........

這個數列從第3項開始,每一項都等於前兩項之和。

def fab(max): nn, a, b = 0, 0, 1 nwhile n < max: n yield b n # print b n a, b = b, a + b n n = n + 1n

執行 fab(5),我們可以得到如下輸出:

>>> fab(5) n 1 n 1 n 2 n 3 n 5n

如果你和我一樣還是萌新的話可以看看這個 Python yield使用淺析 或 The Python yield keyword explained

推薦閱讀:

OpenCV檢測篇(二)——笑臉檢測
採集方案策略之App抓包
你打算什麼時候轉到Python3?

TAG:Python |