我是靠谱客的博主 虚心巨人,最近开发中收集的这篇文章主要介绍yield generate python_Python之yield关键字与生成器,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

快速理解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关键字与生成器所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部