python
中什么是生成器
概念:
一边循环一边计算的机制,称为生成器:
generator生成器不保存数据,保存的是状态
,在每次进行迭代时返回一个值,直到遇到
StopIteration异常结束
记住上一次返回时在函数体中的位置。对生成器函数的后续调用跳转至暂停的位置,而上次调用的所有局部变量都保持不变。
构建:
生成器表达式:
gen= (x for x in range(100))
生成器函数:
在函数中使用
yield关键字
生成器函数包含一个或者多个
yield当调用生成器函数时,将返回一个对象,但是不会立刻向下执行
像
__iter__()和
__next__()方法等是自动实现的,所以我们可以通过
next()方法对对象进行迭代
一旦函数被
yield,函数会暂停,控制权返回调用者
局部变量和它们的状态会被保存,直到下一次调用
函数终止的时候,
StopIteraion会被自动抛出
优点:
1
,更容易使用,代码量较小
2
,内存使用更加高效。比如列表是在建立的时候就分配所有的内存空间,而生成器仅仅是需要的时候才使用,更像一个记录
3
,代表了一个无限的流。如果我们要读取并使用的内容远远超过内存,但是需要对所有的流中的内容进行处理,那么生成器是一个很好的选择,比如可以让生成器返回当前的处理状态,由于它可以保存状态,那么下一次直接处理即可
生成器方法:
close()
send()
throw()
yieldfrom
使用:
1
,
next(generator) 2
,
generator.__next__() 3
,
while True中迭代要捕获异常
4
,
for循环中迭代会自动处理异常
5
,在生成器函数中使用
return会使生成器终止并抛出
StopIteration异常,
return的返回值会作为异常的描述信息
总结:
1
,第一次执行
next(generator)时,会执行完
yield语句后程序进行挂起,所有的参数和状态会进行保存。再一次执行
next(generator)时,会从挂起的状态开始往后执行。在遇到程序的结尾或者遇
StopIteration时,循环结束。
5
,
next()等价于
send(None) 6
,不同的生成器对象是彼此独立的