python-生成器進階~生成器函數
阿新 • • 發佈:2017-11-11
logs 衣服 with 數據 每次 log -a none open
監聽文件末尾追加的例子
def tail(): f = open(‘文件‘,‘r‘,encoding=‘utf-8‘) f.seek(0,2) while True: line = f.readline() if line: yield line import time time.sleep(0.1) g = tail() for i in g: print(i.strip())
send 方法
send方法: def func(): print(‘*‘*10) a= yield 5 print(a) yield 10 g = func() print(g.__next__()) print(g.send(‘wenwen‘)) # print(g.__next__())
從哪一個yield開始接著執行,send就把一個值傳給了那個yield
send 不能用在第一個觸發生成器
生成器函數中有多少個yield就必須有多少個next+send
def averager(): total = 0.0 count = 0 averager = None while True: term = yield averager total+= term count += 1 averager = total/count g_avg = averager() print(g_avg.__next__()) print(g_avg.send(20))
生成器的預激裝飾器
生成器的預激裝飾器
生成器函數:生成一個生成器函數
生成器的本質是叠代器
生成器函數的特點:帶有yield關鍵字
且調用後,函數內的代碼不被執行
觸發執行的方式:next send for循環
next 和 send 是執行幾次拿幾次的數據,可能會遇到取完的數據
for循環是每次取一個,取完為止,for循環不會報錯
觸發執行的方式:在衣服廠定衣服的例題
next
send(選會):send(None) == _next_(),send在next的基礎上傳一個值到生成器函數內部
send操作不能用在生成器使用的第一次
for 循環
def cloth(): for i in range(100): yield ‘衣服%s‘%i g1 = cloth() g2 = cloth() print(g1.__next__()) print(g1.__next__()) for c in cloth(): print(c) for i in range(10): print(g1.__next__()) for i in range(100): #由於總數是100,已經取了10個了,當range裏面為100時,剩下的90個數不夠取100個就會報錯 print(g1.__next__()) for i in g1: #這種方法就不會報錯,有多少取多少 print(g1.__next__()) for c in g1: print(c) if c.endswith(‘80‘): break print(‘*‘*20) for c in g1: print(c)
例題:要求執行結果為‘A‘,‘B‘,‘C‘,‘D‘
def func(): a = ‘AB‘ b = ‘CD‘ # yield from a for i in a:yield i # yield from b for i in b:yield i g = func() print(g.__next__()) print(g.__next__()) print(g.__next__()) print(g.__next__())
g._next_()也可以用next(g)來表示
g._iter_()也可以用iter(g)來表示
不是所有的_方法_都可以使用方法()來表示
python-生成器進階~生成器函數