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) #生成器表达式,直接使用函数的括号,无需再另外家括号