生成器有主要有四種方法:
乙個斐波那契數列的例子
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 列印結果 ...