所属网站分类: python基础 > 语句
要了解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"了。
内容来源于网络如有侵权请私信删除
- 还没有人评论,欢迎说说您的想法!