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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 播妞 程序媛   /  2017-9-4 16:36  /  2442 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Python中的yield关键字做了什么
要理解yield做了什么,就必须明白生成器(generators)为何物,而在明白生成器之前还要知道迭代器(iterables)。

1.迭代器
当我们创建一个list的时候,我们可以一个接一个的读取它的成员。这种一个接一个读取的行为叫做迭代:
>>>mylist = [1, 2, 3]
>>>for i in mylist:
...    print(i)
1
2
3
mylist就是一个迭代器。当我们使用列表推导式(亦称列表生成式,list comprehension)时,我们创建了一个list,同时还有一个迭代器:
>>>mylist = [x*x for x in range(3)]
>>>for i in mylist:
...    print(i)
0
1
4
我们可以使用“ for … in …”的任何事物都是迭代器,如:列表、字符串、文件等。
这些迭代器很便利,我们可以想读取多少就读取多少,但是我们要在内存中储存所有的可取值,然而当我们有太多的值时我们不总是希望如此。
2.生成器
本帖隐藏的内容

生成器(generators)也是迭代器,但是我们只能对其迭代一次。这是因为生成器并没有在内存中存储所有的值,而是要靠动态生成。
>>> mygenerator = (x*x for x in range(3))>>> for i in mygenerator:...    print(i)014
我们用圆括号()代替了方括号[],除此之外是相同的。但是,我们不能重复执行for i in mygenerator,因为生成器只能使用一次:先计算出0,然后就忘了这个0并计算出1,最终计算出4。

3.yield
游客,如果您要查看本帖隐藏内容请回复

重要的细节部分:
第一次for调用由我们的函数创建的生成器时,会从头执行我们函数中的代码直到遇见yield关键字,然后会返回循环的第一个值。其后每次调用都会再一次运行我们在函数中写的循环,返回下一个值,以此一直到再没有返回值。
一旦函数运行但不再激发yield时,就可以认为生成器已经空了。这可能是由于循环已经结束,或者由于我们不再满足“if/else”的条件判断。


7 个回复

倒序浏览
我来占层楼啊   
回复 使用道具 举报
非常感谢!!!!
回复 使用道具 举报
初次报道
回复 使用道具 举报
回复 使用道具 举报
看看结果,学习学习
回复 使用道具 举报
支持一下
回复 使用道具 举报
播妞 程序媛 2018-1-19 10:05:13
8#
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马