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

浅议 yield 语句

python 中最富争议的语句就是 yield 语句,yield 语句提供了用户构造实现生成器(generator)的可能,但由于其语法和函数很相像,所以容易误用和误解:

让我们来看下面一段经典的 yield 语句使用:

1. yield 使用示例

请点击输入图片描述

以上是 python 官网中对于fibonacci sequence(斐波那契数列)的一个经典实现,其中的 yield 语句每次返回一个 fibo 数;yield 语句的使用使得 fibo()成为了一个生成器函数,该函数需要实例化出一个生成器对象才能被投入使用,语句f = fibo() 正是在做实例化生成器的步骤,这点很关键;有了生成器实例对象,利用生成器对象的 next()方法,可以每次当即计算生成一个 fibo 数,并将其返回。生成器对象内部会记忆 上下文状态 ,简单来说就是记忆暂停播放的点,在上述示例中就是记住变量a 和 变量b 的当前值。

请点击输入图片描述

生成器对象相比于序列对象(sequence object),例如列表对象,元组对象,字符串对象等的来说,是一种数据的延迟加载方案,可以节约出大量的内存资源,是一种以时间换空间的性能优化策略。下面的示例,能够体现出yield 生成器对象的这种使用:

2. yield 生成器作为迭代器示例

请点击输入图片描述

运行的结果如下显示:

请点击输入图片描述

上述代码示例中的agen对象作为可迭代对象放入了 for-in语句中,随着 while 条件满足的失败,生成器的生命周期也到了终点,再调用该对象的next()方法,则会抛出StopIteration的异常;从两次运行的时间耗费长度上来看,显然 yield 生成器的用时要相对耗时多些,但这是内存节约的代价;deltaNum返回的是完整的列表对象,占5个整数的内存,而arithmetic仅仅占用一个整数的内存空间。

更多关于python语言方面的文章,请前往51Testing软件测试网。

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

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券