文档开发者中心
我的

Python十大装B语法

再举一个数组元素求平方的例子,这次用map函数:

>>> a = [1,2,3]>>> for item in map(lambda x:x*x, a):
 print(item, end=', ')1, 4, 9, 12345

8. yield 以及生成器和迭代器

yield 这词儿,真不好翻译,翻词典也没用。我干脆就读作“一爱得”,算是外来词汇吧。要理解 yield,得先了解 generator(生成器)。要了解generator,得先知道 iterator(迭代器)。哈哈哈,绕晕了吧?算了,我还是说白话吧。

话说py2时代,range()返回的是list,但如果range(10000000)的话,会消耗大量内存资源,所以,py2又搞了一个xrange()来解决这个问题。py3则只保留了xrange(),但写作range()。xrange()返回的就是一个迭代器,它可以像list那样被遍历,但又不占用多少内存。generator(生成器)是一种特殊的迭代器,只能被遍历一次,遍历结束,就自动消失了。总之,不管是迭代器还是生成器,都是为了避免使用list,从而节省内存。那么,如何得到迭代器和生成器呢?

python内置了迭代函数 iter,用于生成迭代器,用法如下:

>>> a = [1,2,3]>>> a_iter = iter(a)>>> a_iter<list_iterator object at 0x000001B2DE434BA8>>>> for i in a_iter:
 print(i, end=', ')1, 2, 3, 

yield 则是用于构造生成器的。比如,我们要写一个函数,返回从0到某正整数的所有整数的平方,传统的代码写法是这样的:

>>> def get_square(n):
 result = list()
 for i in range(n):
  result.append(pow(i,2))
 return result>>> print(get_square(5))[0, 1, 4, 9, 16]

但是如果计算1亿以内的所有整数的平方,这个函数的内存开销会非常大,这是 yield 就可以大显身手了:

>>> def get_square(n):
 for i in range(n):
  yield(pow(i,2))>>> a = get_square(5)>>> a<generator object get_square at 0x000001B2DE5CACF0>>>> for i in a:
 print(i, end=', ')0, 1, 4, 9, 16, 

如果再次遍历,则不会有输出了。

点赞
收藏
回复
分享
举报
浏览371 发布于2019-11-15 10:08未知归属地
全部评论
最多点赞
最新发布
最早发布
暂无评论
暂无评论
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要发帖子

目录 收起
8. yield 以及生成器和迭代器
了解社区公约,与您携手共创和谐专业的开发者社区。