python的本质,讨论 - 廖雪峰的官方网站

关于 yield:

yield一词的意思有 n.产出,产量;v.让步,提供。

所以当我们定义一个生成器函数时(带yield关键字的函数):

def Iter():

for i in range(10):

yield i

这个Iter()函数的工作就是按顺序产出(生成)0~910个数字,同时,它也是一个可迭代对象。

而要产出0~9,则需通过next()函数不断调用方可,同时我们也知道,python的for循环本质就是不断调用next()函数从可迭代对象里取值。因此,若我们要输出0~9,只需:

for val in Iter():

print(val)

得到如下输出:

0

1

2

3

4

5

6

7

8

9

关于 yield from:

从字面意思上来说yield from就是 从...中生成,而实质上它的确如此。

那么问题来了,它可以从那里yield呢?

我们看回上面的:

def Iter():

for i in range(10):

yield i

这里的i是range(10)里的元素,而range(10)是一个可迭代对象(这点很重要!!!)。所以我们不妨大胆假设:yield from就是 从中生成。

那么我们试着改写一下上面的Iter():

def Iter():

yield from range(10)

再执行如下代码:

for val in Iter():

print(val)

意料之中,我们得到如下输出:

0

1

2

3

4

5

6

7

8

9

综上,yield from=for i in : yield i。

我们可以再进一步。我们知道,可迭代对象有许多,列表、元组、字典、列表生成式,甚至生成器或生成器函数本身都是一个可迭代对象。那么我们是否可以定义一个生成器函数,然后yield from它呢?

答案是肯定的:

#定义一个生成器函数

def Iter():

for i in range(10):

yield i

#定义一个 "yield from生成器函数" 的生成器函数

def yieldFromIter():

yield from Iter()

#封装print

def out():

for i in yieldFromIter():

print(i)

f __name__ == '__main__':

out()

执行上面脚本,我们同样能得到如下输出:

0

1

2

3

4

5

6

7

8

9

以上就是本人对yield,yield from的一些简单解释。如有不明,欢迎各位与我探讨。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值