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"条件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值