概述
快速理解yield
当在函数中看见yield关键字时,可以使用下述技巧帮助理解函数背后的逻辑:在函数起始位置插入result = [] ;
将有yield expr的地方替换为 result.append(expr);
在函数的末尾插入 return result;
此时,代码中没有 yield 关键字;
比较和源代码的区别。
这个技巧可能会帮助了解函数背后的逻辑,但是实际发生在yield上的情况与基于列表的方法中发生的情况有很大的不同。在许多情况下,yield方法将具有更高的内存效率和更快的速度。在其他情况下,这个技巧会使函数陷入无限循环,即使原来的函数可以正常工作。
======深入理解=======
理解关键字yield之前,首先要理解什么是生成器;而要理解生成器(generators),就要搞懂什么是可迭代对象(iterables)。
可迭代对象
当创建了一个列表之后,便可以逐个读取其中的元素。这个过程被称为迭代:
>>> mylist = [1, 2, 3]
>>> for i in mylist:
... print(i)
1
2
3
这里面mylist就是一个可迭代对象,当使用列表解析的时候,创建一个列表,也就得到一个可迭代对象:
>>> mylist = [x*x for x in range(3)]
>>> for i in mylist:
... print(i)
0
1
4
所有能够使用for... in...的对象都是可迭代对象:列表、字符串等。
这些可迭代对象非常方便,因为可以根据你的需求来随意访问他们,但是同时也将所有的值存储在了内存中,当值的数量很多时,是不希望这种情况这种情况发生的。
生成器
生成器属于迭代器,一种只可以迭代一次的可迭代对象。生成器没有将所有的值都存储在内存中,而是现场产生所需的值。
>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator:
... print(i)
0
1
4
这里除了使用 () 而不是 [],其余部分跟上述相同。 但是,请注意你无法第二次使用for i in mygenerator ,这是因为生成器只能够被使用一次。它计算出0,然后丢弃它,接着计算出1,然后继续下去...
Yield
关键字yield的用途与return类似,只不过函数返回的是一个生成器。
>>> def createGenerator():
... mylist = range(3)
... for i in mylist:
... yield i*i
...
>>> mygenerator = createGenerator() # create a generator
>>> print(mygenerator) # mygenerator is an object!
>>> for i in mygenerator:
... print(i)
0
1
4
如果你的函数会返回一大堆你只需要读一次的值时,这个例子是很有用的。
说回yield,需要理解的是当你调用函数的时候,函数体中的代码是不执行的。函数仅仅返回生成器对象。
然后,每次for使用生成器的时候,函数都将从上次离开的位置继续执行。
当for第一次调用函数所创建的生成器对象的时候,将从函数的最开始执行,直到遇到yield 关键字,并返回循环中的第一个值;然后,接下来的每次调用将执行函数循环体中的其他迭代,并返回下一个值;继续这个过程直到生成器为空,即函数运行时不在遇到yield.。这种情况可以是由于循环结束,也可以是不再满足"if/else"条件。
最后
以上就是虚心巨人为你收集整理的yield generate python_Python之yield关键字与生成器的全部内容,希望文章能够帮你解决yield generate python_Python之yield关键字与生成器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复