感覺是在需要返回某個值的地方通過yield來代替return,
不是很明白其用法,所以仔細研究下。
乙個使用了yiled關鍵字的函式就不再是乙個普通的函式了,而是乙個生成器函式(generator function),
當函式被呼叫的時候將返回乙個迭代器(iterator)。
所以下面將分別講解迭代器和生成器這兩個概念。
寫道迭代器是乙個物件,它實現了迭代器協議,
一般需要實現如下兩個方法
1)next方法
返回容器的下乙個元素
2)__iter__方法
返回迭代器自身
l=[0,1,2,3,4,5,6]
for i in l:
print i
l是乙個type為list的物件,這段for-in**在執行的時候其實是呼叫了l的__iter__()函式,返回了乙個實現了__next__()或next()(各個版本的python可能不一樣,我試驗的時候所使用的版本為2.6.2)的迭代器物件,每迴圈一次就會通過next取下乙個元素。
當然我們完全沒有必要先把所有的元素都算出來放到乙個list裡或者其他容器類裡進行迴圈,這樣比較浪費空間。
我們可以直接建立自己的乙個迭代器。
# -*- coding: utf-8 -*-
'''fibonacci iterator'''
class fib:
'''乙個可以生成fibonacci 數列的迭代器'''
def __init__(self, max):
self.max = max
def __iter__(self):
self.a = 0
self.b = 1
return self
def next(self):
fib = self.a
if fib > self.max:
raise stopiteration
self.a, self.b = self.b, self.a + self.b
return fib
定義好了這個fibonacci迭代器,我們就可以來使用它了。
from fibonacci2 import fib
for n in fib(1000):
print n
當呼叫fib(1000)的時候,將生成乙個迭代器物件,每一次迴圈都將呼叫一次next取到下乙個值。
所以我們可以看出迭代器有乙個很核心的東西就是在迴圈中,迭代器可以記住之前的狀態。
前面我們說了,任何使用了yield關鍵字的函式都不再是普通的函式了,我們還是來看例項吧,這樣比較容易理解
def fib(max):
a, b = 0, 1
while a < max:
yield a
a, b = b, a + b
這裡簡單的幾行**就實現了上面的迭代器類那麼一大堆**所實現的功能
使用的時候和上面很類似:
from fibonacci import fib
for n in fib(1000):
print n
引文fib函式使用了yield所以它是乙個生成器函式,當我們呼叫fib(1000)的時候它其實是返回了乙個迭代器,且這個迭代器可以控制生成器函式的執行。
我們通過這個返回的迭代器的動作控制fib這個生成器函式的執行。
每當呼叫一次迭代器的next函式,生成器函式執行到yield之處,返回yield後面的值且在這個地方暫停,所有的狀態都會被保持住,直到下次next函式被呼叫,或者碰到異常迴圈退出。
所以生成器的概念還是很簡單的。
1.for-in語句在底層都是對乙個迭代器物件進行操作的
2.使用了yield關鍵字的函式就是乙個生成器函式,被呼叫的時候生成乙個可以控制自己執行的迭代器。
從辭職說起
20出頭的人是熱血青年,有夢想的人自然也是滿懷激情。願意呆在乙個地方是因為那個地方能讓我們憧景,離開乙個地方,自然也是因為那個地方我們再也沒有繼續呆下來的熱情。打 辭職了以後,不知是從哪來的一股輕鬆的感覺。當時,是由於 醫學影象 之於我是乙個非常敏感的詞眼,還有是創業的一種意念,我充滿激情地走進了公...
從Ajax的HelloWorld說起
從ajax的helloworld說起 收藏 就這個經典的helloworld示例,學習ajax的互動模式。還是從如何建立helloworld說起吧 1 建立 xmlhttprequest 物件 2 初始化非同步請求,xmlhttprequest物件如何做 中轉站 的工作,就在這裡體現 先獲取個客戶端...
從語句 char p test 說起
從語句 char p test 說起 陳皓 我相信,使用 c c 多年的人對下面這個字串賦值語句都不會陌生吧。char p test 同時,我也相信,各位在使用這種語句後吃過很多苦頭也不少吧?只要你想利用指標 p來改變字串的內容,你的程式都會得到乙個讓你顏面盡失乙個記憶體非法操作。比如,下面的這些語...