yield生成器函式的一點總結

2021-09-06 08:59:38 字數 2377 閱讀 9691

生成器有主要有四種方法:

乙個斐波那契數列的例子

def

fibonacci

(): a, b = 0, 1

while

true:

yield b

a, b = b, a+b

a = fibonacci()

for i in range(10):

print a.next()

執行結果:

112

35813

2134

55python2.7 fb.py 0.01s user 0.01s system 94% cpu 0.025 total

生成器每次生成乙個數字並返回。

def

reciver

():while

true:

n = (yield)

print

"got %s" % n

r = reciver()

r.next()

r.send(1)

r.send('2')

執行結果:

got 1

got 2

python2.7 rec.py 0.01s user 0.01s system 86% cpu 0.023 total

這個模型可以看做接收外部資料並進行處理。

生成器能否接收send傳送來的資料,處理之後再返回呢?答案是肯定的

def

get():

n = 0

result = none

while

true:

n = (yield result)

result = n*10

t = get()

t.next()

for i in range(10):

print t.send(str(i))

t.close()

執行結果

0000000000

1111111111

2222222222

3333333333

4444444444

5555555555

6666666666

7777777777

8888888888

9999999999

python2.7 problem.py 0.02s user 0.00s system 83% cpu 0.024 total

當然生成器函式也是函式,也支援引數傳遞。

def

countdown

(n):

print("counting down from %d" % n)

while n > 0:

yield n

n -= 1

return

c = countdown(10)

print c.next()

print c.next()

for i in countdown(10):

print i

print sum(countdown(10))

執行結果

counting down from 10109

counting down from 10109

8765

4321

counting down from 10

55

從上面的例子我們發現,每次呼叫生成器函式要先執行next()函式,然後才能傳送資料, 如果忘記的話就會報錯。

typeerror: can't send non-none value to a just-started generator
這個有人容易忘記。這怎麼辦?用裝飾器來自動執行:

def

coroutine

(func):

defstart

(*args,**kwargs):

g = func(*args,**kwargs)

g.next()

return g

return start

@coroutine

defreciver

():while

true:

n = (yield)

print

"got %s" % n

r = reciver()

r.send(1)

r.send('2')

生成器 PHP的生成器yield 原創

在php 5.5中,php多了乙個新的特性,那就是生成器 generator 生成器提供了一種更簡單的方法來實現簡單的物件迭代。下面的manual的引用 生成器提供了一種更容易的方法來實現簡單的物件迭代,相比較定義類實現 iterator 介面的方式,效能開銷和複雜性大大降低。生成器允許你在 for...

Python生成器 yield的使用

通過列表生成式,我們可以直接建立乙個列表。但是,受到記憶體限制,列表容量肯定是有限的。而且,建立乙個包含100萬個元素的列表,不僅占用很大的儲存空間,如果我們僅僅需要訪問前面幾個元素,那後面絕大多數元素占用的空間都白白浪費了。所以,如果列表元素可以按照某種演算法推算出來,那我們是否可以在迴圈的過程中...

Python生成器函式 yield 協程應用

生成器應用 m i for i in range 5 print type m 列印結果 型別 生成器 print next m 列印結果 0 definc for i in range 5 yield i print type inc 列印結果 型別 函式 print type inc 列印結果 ...