首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

python语法——yield 使用解析

带有 yield 的函数是一种特殊函数,其返回的函数值是一个 generator(生成器)。

yield 示例

举例说明 yield 的用法:生成一个自增平方序列:

结果输出:

可以看出,虽然 square 这个函数没有 关键字,但实际上 是一个生成器,里面数据的顺序是按照函数中 的顺序来存放的。生成器能够迭代的关键是它有一个 方法,工作原理就是通过重复调用这个方法,直到捕获一个异常。

区别:python3 中的生成器的迭代函数为 或 ,python2 为 。

yield原理解释

可以将 理解为特殊的 ,只不过可以 很多次,然后使用 方法来读取 过的这些数据。

如果一直调用 方法,当执行到没有可迭代的值后,程序就会报错:,所以一般不会手动的调用方法,而是使用for循环:

生成器迭代一次(通过 或 等)遇到 时就返回 后面的值。

重点是:下一次迭代时,从上一次迭代遇到的后面的代码开始执行。比如我们多加几个输出语句:

结果为:

可以看到,第一次迭代和最后一次迭代的输出结果比较特殊。

第一次迭代时,生成器开始按照 内部代码运行,直到遇到 为止,然后退出 函数,且返回 。

中间的几次迭代,生成器按照 内部代码运行,但是是从上一次 的后一行即 这一行开始执行,直到遇到 为止。

最后一次只输出了 ,这是为什么呢?

这是因为,最后一次迭代时,还是从 开始执行,但是尝试返回到循环的开头时,发现已经不满足循环条件,因此直接退出,也不会再有 的结果。

yield 中 return 的作用

既然带 的函数不需要 ,那么如果强制加上 会如何?

这时, 会导致提前结束生成器的迭代。

比如在程序多加一行 :

结果为:

第一次迭代是正常的,第二次迭代时,从 开始运行,但是下一行 了,因此生成器认为整个迭代已经结束。这时候如果再调用 ,就会报错:。

区别:python3 中 yield 函数内 return + 某个值,作用与单独的 return 相同;但是 python2 只允许单独的 return,如果后面加某个值,会报错:SyntaxError: 'return' with argument inside generator

备注

如一个函数中出现多个 则 会停止在下一个 前。

使用生成器的好处:实时生成数据,不全存在内存中。

使用生成器的坏处:只可以读取它一次,因为用的时候才生成。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190103G0JOCW00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券