從python的yield說起

2021-08-30 11:48:00 字數 1978 閱讀 6160

感覺是在需要返回某個值的地方通過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來改變字串的內容,你的程式都會得到乙個讓你顏面盡失乙個記憶體非法操作。比如,下面的這些語...