python-生成器进阶~生成器函数

监听文件末尾追加的例子
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)来表示
不是所有的_方法_都可以使用方法()来表示
 


posted @ 2017-11-11 10:51  dwenwen  阅读(148)  评论(0编辑  收藏  举报