理解yield关键字

迭代

在理解yield关键字之前,我们先了解下什么是迭代、可迭代、迭代器、迭代器协议。
我们平常使用到的很多数据其实都是容器,它们包含了很多其它类型的元素,从这些容器中逐个获取数据的过程就是迭代。你可以想象一下,我们利用for循环从某一个列表对象中逐次取出元素,这个过程就是迭代,而这个列表对象称为可迭代。
迭代器抽象的是一个数据流,是只允许迭代一次的对象。对迭代器不断调用 next() 方法,则可以依次获取下一个元素;当迭代器中没有元素时,调用 next() 方法会抛出 StopIteration 异常。迭代器的 iter() 方法返回迭代器自身;因此迭代器也是可迭代的。

生成器

知道了什么是迭代后,我们就来解析生成器与yield。
生成器函数是一种特殊的函数;生成器则是特殊的迭代器。
如果一个函数包含 yield 表达式,那么它是一个生成器函数;调用它会返回一个特殊的迭代器,称为生成器。
生成器函数被调用后,其函数体内的代码并不会立即执行,而是返回一个生成器。当返回的生成器调用成员方法时,相应的生成器函数中的代码才会执行。
关于生成器函数,如果你还不太了解,可以这样去思考:
在函数开始处,加入 result = list();
将每个 yield 表达式 yield expr 替换为 result.append(expr);
在函数末尾处,加入 return result。

优点

那么使用yield有什么好处呢?
在很多时候,我们只是需要逐个顺序访问容器内的元素。大多数时候,我们不需要一口气获取容器内所有的元素。比方说,顺序访问容器内的前 5 个元素,可以有两种做法:
获取容器内的所有元素,然后取出前 5 个;
从头开始,逐个迭代容器内的元素,迭代 5 个元素之后停止。
显而易见,如果容器内的元素数量非常多(比如有 10 ** 8 个),或者容器内的元素体积非常大,那么后一种方案能节省巨大的时间、空间开销。
综合来说,yield关键字的使用就是为了减少时间和空间的浪费,从而提高效率。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值