A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© huawei 黑马粉丝团   /  2018-7-31 23:28  /  3704 人查看  /  1 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 人工智能 于 2018-8-6 17:50 编辑

为了Python的自学党们,黑马真的是拼了!我们不仅有“人工智能+Python学习路线图,还根据以往的经验,总结出学习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

使用:
       1next(generator)
       2generator.__next__()
       3while True中迭代要捕获异常
       4for循环中迭代会自动处理异常
       5,在生成器函数中使用return会使生成器终止并抛出StopIteration异常,return的返回值会作为异常的描述信息

总结:
       1,第一次执行next(generator)时,会执行完yield语句后程序进行挂起,所有的参数和状态会进行保存。再一次执行next(generator)时,会从挂起的状态开始往后执行。在遇到程序的结尾或者遇StopIteration时,循环结束。
       2,可以通过generator.send(arg)来传入参数
       3,可以通过generator.throw(exception)来传入一个异常。throw语句会消耗掉一个yield
       4,可以通过generator.close()来手动关闭生成器
       5next()等价于send(None)
       6,不同的生成器对象是彼此独立的



1 个回复

倒序浏览
您需要登录后才可以回帖 登录 | 加入黑马