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 |