所属网站分类: python基础 > 语句


作者:goodbody

链接: http://www.pythonheidong.com/blog/article/10/

来源:python黑洞网 www.pythonheidong.com


要了解yield它的作用,您必须了解生成器是什么

 

迭代器

创建列表时,您可以逐个取出元素。逐个读取它的项称为迭代。

 

>>> mylist = [1, 2, 3]
>>> for i in mylist:
...    print(i)
1
2
3

 

当您使用列表推导时,您创建一个列表,因此是一个可迭代的:

 

>>> mylist = [x*x for x in range(3)]
>>> for i in mylist:
...    print(i)
0
1
4

在python中你可以使用的所有都是可迭代的; lists,strings,文件...等等

这些迭代很方便,因为您可以根据需要读取它们,但是您将所有值存储在内存中,当您拥有大量值时,这并不总是您想要的。

生成器

生成器是迭代器,是一种只能迭代一次的迭代器。生成器不会将所有值存储在内存中,它们会动态生成值:

 

>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator:
...    print(i)
0
1
4
它和迭代器产生的值是相同的,除了你用()而不是[]。但是,由于生成器只能使用一次,所以不能再执行for i in mygenerator:它们计算0,然后打印它并计算1,然后逐个计算4。

 

yield

yield相当于return,但跟return又有所不同

 

>>> def createGenerator():
...    mylist = range(3)
...    for i in mylist:
...        yield i*i
...
>>> mygenerator = createGenerator() # create a generator
>>> print(mygenerator) # mygenerator is an object!
<generator object createGenerator at 0xb7555c34>
>>> for i in mygenerator:
...     print(i)
0
1
4

你的函数将返回一组你只需要使用一次的大量值时使用yield它会很方便。

要掌握yield,您必须明白,当您调用该函数时,您在函数体中编写的代码不会运行。该函数只返回生成器对象)

然后,您的代码将从每次for使用生成器时停止的位置继续。

第一次for调用从函数创建的生成器对象时,它将从开始运行函数中的代码直到它遇到yield,然后它将返回循环的第一个值。然后,每个其他调用将再次运行您在函数中写入的循环,并返回下一个值,直到没有值返回。

函数不再被yield,这可能是因为循环已经结束,或者因为你不再满足"if/else"了。

 

 




 
内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!