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)来表示
不是所有的_方法_都可以使用方法()来表示