生成器
生成器generator
生成器函式generator
m=(i for i in range(5)) #定義乙個生成器
print(type(m)) #判斷m的型別,是乙個生成器
print(next(m)) #使用next函式
def inc(): # 定義乙個inc函式
for i in range(5):
yield i
print(type(inc)) #輸出inc函式的型別,是乙個功能模組
print(type(inc())) #輸出inc函式物件的型別,是乙個生成器
g=inc() #將函式物件賦給g,即將生成器賦給g
type(g) #輸出變數g的型別,是乙個生成器
next(g) #使用next函式輸出生成器的值,每次輸出乙個,都輸出完後,繼續執行報錯
for x in g: #使用迴圈能全部輸出
生成器的執行
def gen():
print('line 1')
yield 1
print('line 2')
yield 2
print('line 3')
return 3
yield 4
next(gen()) # 列印'line 1',在yield 1出暫停,輸出1
next(gen()) # 與上面結果相同,相當於重新呼叫gen函式
g=gen() #相當於將生成器賦給g
print(next(g)) #引用生成器
print(next(g)) #引用生成器
print(next(g)) #stopiteration
print(next(g,'end')) #沒有元素給預設值
生成器函式
生成器應用
無限迴圈
def counter():
i=0while true:
i+=1
yield i
c=counter() #counter()是乙個生成器
計數器
def inc():
def counter():
i=0while true:
i+=1
yield i
c=counter()
return next(c)
print(inc()) #相當於一直重新執行inc()函式,counter一直被重新定義初始化
return next(c) #2 #1,2,3可以合併成return lambda :next(c)
return inner #3
foo=inc() #inc()是乙個生成器
斐波那契數列
生成器互動
python提供了乙個和生成器物件互動的方法send,該方法可以和生成器溝通。
#重置功能的計數器
def inc():
def counter():
i=0while true:
i+=1
response =yield i
if response is not none:
i=response
c=counter()
return lambda x=false: next(c) if not x else c.send(0)
協程 coroutine
有2個生成器a、b
next(a)後、a執行到了yield語句暫停,然後去執行next(b)、b執行到yield語句也暫停,然後再次呼叫next(a),再呼叫next(b)、周而復始,就實現了排程的效果
可以引入排程的策略來是實現切換的方式
yield from語法
從python 3.3開始增加了yield from語法,使得yield from iterable 等價於 for item in iterable : yield item
def inc():
for x in range(1000):
yield x
def inc():
yield from range(1000)
python中生成器yield
def yield demo for x in range 3 yield x print 生成器後一行 a yield demo print a 這裡的a是乙個生成器物件 可以用for迴圈來遍歷生成器物件裡的元素 for i in a print i 那麼yield的工作過程是怎麼樣的呢?可以通過...
python中生成器的使用
在python中我們常聽到迭代器和生成器,但是本人分開來介紹,只為告訴大家迭代器和生成器不是乙個東西,在上篇文章中我們詳細的介紹過迭代器和可迭代物件,本章重點介紹生成器。對於呼叫乙個普通的python函式,一般是從函式的第一行 開始執行,結束於return語句 異常或者函式所有語句執行完畢。一旦函式...
python中生成器的應用
生成器的應用 實現多工 import time def task 1 while true print 1 time.sleep 0.1 yield def task 2 while true print 2 time.sleep 0.1 yield task 1 task 2 def main t...