python yield理解_如何理解Python中的Yeild、迭代器、生成器?

要理解yield的作用,就必须理解生成器是什么。在理解生成器之前,必须先理解迭代器。

Iterable 迭代器

当创建一个列表时,可以逐个读取它的项。逐项读取其项称为迭代:

e1f8a504d33e4c52b7973934c4f9dbc3

Mylist就是一个可迭代的对象,这就是迭代

所有可以用for … in … 的对象都是可迭代的对象,即迭代器,比如list,string

这些迭代器非常方便,因为你可以随心所欲地读取它们,但是这会将所有的值都存储在内存中,当有很多值时,这可能就不是你想要的效果了,这个时候就需要生成器登场了

Generators 生成器

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

69131fe7705146138c01d1be29f52841

在python3中(x*x for x in range(3)) 返回的并不是一个元祖,而是一个生成器,当用for迭代时才会逐个得到元素。用[]就会返回一个list而不是生成器,这里用个()得到一个生成器,那么如果有更复杂的逻辑呢,该如何得到一个生成器呢,这个时候就需要yield登场了

Yield 关键字

yield是一个与return类似的关键字,只是函数将返回一个生成器。

873f4cf6498a41e1b4d36f76a604d519

这是一个简单的例子,但是当你知道函数将返回一组只需要读取一次的值时,这是很方便的。

要掌握yield,你必须了解,在调用函数时,在函数体中编写的代码不会运行。函数只返回生成器对象

然后,你的代码将从每次使用生成器时停止的地方继续。

接下来是最难的部分:

for函数第一次调用在函数中创建的生成器对象时,它将从头运行函数中的代码,直到达到yield,然后返回循环的第一个值。然后,每个剩下的调用将再次运行你在函数中编写的循环,并返回下一个值,直到没有要返回的值为止。

一旦函数运行结束,生成器就会被认为是空的,就不会再命中yield。这是因为循环已经结束。

这就是yield的用法,简单的说就是用yield来创建生成器,此外python自带了一个创建生成器的工具Itertools

Itertools

itertools模块包含一些特殊的函数来操作迭代器。有没有想过复制一个生成器?用一行代码将嵌套列表中的值分组?如何使用map和zip时不再创建list?这时Itertools就是你最好的选择, 简单举个例子,如何得到一个序列的排列组合,以下例子就是返回一个排列组合的生成器。

77941421641b482f8d598c1d0924035f

本质上来说,迭代器能迭代是因为实现了两个方法:__iter__()方法__next__()方法

思考一下:如何处理一个10G的文件,统计出单词数量?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值