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-生成器进阶~生成器函数
logs 衣服 with 数据 每次 log -a none open
原文:http://www.cnblogs.com/dwenwen/p/7818519.html
来源: http://www.bubuko.com/infodetail-2390534.html