1、生成器
在python中,一边循环一边计算的机制,称之为生成器:generator
1.1、生成器的定义
生成器是一种迭代器,是一种特殊的函数,使用yield操作将函数构造成迭代器。普通的函数有一个入口,有一个返回值;当函数被调用时,从入口开始执行,结束时返回相应的返回值。生成器定义的函数,有多个入口和多个返回值;对生成器执行next()操作,进行生成器的入口开始执行代码,yield操作向调用者返回一个值,并将函数挂起;挂起时,函数执行的环境和参数被保存下来;对生成器执行另一个next()操作时,参数从挂起状态被重新调用,进入上次挂起的执行环境继续下面的操作,到下一个yield操作时重复上面的过程。Python的循环操作与C语言的实现不同,如果使用List等数据结构需要耗费大量的内容;循环操作中使用生成器只需要在内存中实例化一个对象,可以减少内存占用,提高循环操作的执行速度。
1.1、生成器特点
- 在python中,使用了yield的函数被称之为生成器
- 生成器是一个返回迭代器的函数,只能够用于迭代操作,简单理解就是生成器其实就是一个迭代器
- 在调用生成器运行的过程中,每次遇到yield时,函数会暂停并保存当前所有的运行信息,返回yield值,并在下一次next()方法时,从当前位置继续执行。
- 生成器是一个特殊的程序,可以被用作控制循环的迭代行为,python中生成器是迭代器的一种,使用yield返回值函数,每次调用yield都会暂停,可以使用next()函数和send()函数恢复生成器。
- 生成器一次只能产生一个值,这样消耗的内存数量将大大减小,而且允许调用函数可以很快的处理前几个返回值,因此生成器看起来像是一个函数,但是表现得却像是迭代器
1.2、生成器的创建
一、将列表推导式的[]改为(),就能够生成一个生成器:generator
示例:
>>> l=[x*x for x in [1,2,3,4]]
>>> l
[1, 4, 9, 16]
>>> g=(x*x for x in [3,4,5,6])
>>> g
<generator object <genexpr> at 0x00F58870>
怎么查询每个元素呢,用next()命令:
>>> next(g)
9
>>> next(g)
16
>>> next(g)
25
>>> next(g)
36
>>> next(g)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>>
但是如果每次用next() 也不是很方便,一般生成器是可以和for循环一起使用的。
示例1:
>>> g=(x%2 for x in [2,3,4,5,6,7])
>>> for i in g:
... print(i)
...
0
1
0
1
0
1
>>>