python生成器

来源:互联网 发布:淘宝店铺域名怎么设置 编辑:程序博客网 时间:2024/06/05 21:11

生成器:本质上来说就是迭代器,好处是不用像生成一个列表那么占内存

生成器有两种:

1)生成器函数:

带有yield关键字
执行函数之后返回的是一个生成器,函数内的代码并不会真正执行,想让生成器往外吐数据,需要使用next方法

def cloth():    for i in range(100):        yield '衣服%s' % ig = cloth()  # g是一个生成器,内部代码没有执行for i in g:    print(i)

生成器监听文件末尾追加的例子

def tail():    f = open('文件名', 'r', encoding='utf-8')    f.seek(0, 2)    while True:        line = f.readline()        if line:            yield lineg = tail()for i in g:    print(i.strip())

生成器中send的用法

动态平均值

def averager():    total = 0    count = 1    averager = None    while True:        term = yield averager        count += 1        total += term        averager = total/countg = averager()g.__next__()print(g.send(20))print(g.send(30))print(g.send(28))

send从那一个yield开始接着执行,就把一个值传给了那个yield
send不能用在第一个触发生器
生成函数中有多少个yield就必须有多少个next+send

从生成器中取值的三种方式

#NO.1g = generator()for i in g:    if 判断语句    print(i)#NO.2g = generator()g.send(None)#g = generator()g.__next__()

python3中用yield from取值

def func():    a = 'AB'    b = 'CD'    yield from a  # from后面接收一个可迭代的对象    yield from b

2)生成器表达式:

与列表解析相似只是把列表解析外面的中括号改为小括号

g = (i*i for i in range(10))  # g就是一个生成器g.__next__()