Python中什么是生成器

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时,循环结束。
       2,可以通过generator.send(arg)来传入参数
       3,可以通过generator.throw(exception)来传入一个异常。throw语句会消耗掉一个yield
       4,可以通过generator.close()来手动关闭生成器
       5,next()等价于send(None)
       6,不同的生成器对象是彼此独立的
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值