1. 程式人生 > >python-生成器進階~生成器函數

python-生成器進階~生成器函數

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-生成器進階~生成器函數