python生成器

生成器是一种使用普通函数语法定义的迭代器

所以生成器对象也可以进行迭代,或者放进for循环。先实现一个简单的生成器看下,

创建一个讲列表的列表展开的函数,比如实参为:[[1,2], [3,4],[5,6]],展开为[1,2,3,4,5,6]的函数:

def flatten(nested):
    for sublist in nested:
        for e in sublist:
            yield e       #使用了yield关键字

如果上述的yield关键字改成print函数,就很好理解了,就是普通的函数展开列表,并且一次性输出完所有的元素,这里为了产生一个生成器,所以使用yield关键字,包含yield语句的函数被称为生成器

生成器与普通函数的区别是,生成器不使用return返回一个值,而是用yield生成多个值,每次一个,每次用yield生成一个值之后,函数立即冻结,下次被重新唤醒的时候,函数从停止的地方继续执行直到产生下一个值或者产生StopIteration异常.

 1 nested = [[1,2],[3,4],[5,6]]
 2 for x in flatten(nested):
 3     print(x)
 4 
 5 ....
 6 ....
 7 1
 8 2
 9 3
10 4
11 5
12 6

python中,还有一个叫做生辰器表达式的东西,比如:

1 x = [1,2,3,4,5,6,7]
2 y = (n for n in x)#这里的y就是一个生成器,后面的表达式为生成器表达式,注意是(),不是[]

如果上面使用[ ]的话,就是列表解析。

我们可以用生成器来包装迭代器:

x = [1,2,3,4,5,6]

def sum(sequence):
    total = 0
    for v in sequence:
        total += v
    return total

total = sum(2*n for n in x)   #生成器表达式,直接使用函数的括号,无需再另外家括号

 

posted on 2019-02-17 00:23  情怀当饭吃  阅读(67)  评论(0编辑  收藏  举报

导航