Python中yield的用法——只有小白才能教懂小白

前言 

首先我想说,目前网上对yield的用法的详解要么太晦涩,要么不细致,对新手小白都很不友好。这里我想分享一下我的学习成果,劳烦各位大佬指正:

言归正传

首先我们先来看这样一组代码:

def function():
    print('这里是第一步')
    while True:
        yield ('这是yield传入的内容')
        print('这里是第二步')

f = function()
print(next(f))
next(f)
#以下为运行结果:
这里是第一步
这是yield传入的内容
这里是第二步

定义:

function(一个随便取的函数名称)
f(生成器)(可以把它理解为它是一种和yield搭配出现的特殊函数)

一起逐步分析上述代码:

1.首先我们def(定义)了一个函数function,且这个函数有yield关键字
2.取得一个生成器(属于特殊操作)
注意:该步骤虽然是调用函数function,但不会执行该函数,而是返回了一个生成器对象
3.启动生成器:(#f即给生成器随便取得名称,下文为了便于表述,统一用f和function表示)
方法:next(f)或 f.send(None)
生成器启动后,函数开始执行(这里f和function可以理解为就同一个东西),一直执行到第一个yield 语句(将本行代码运行完毕),返回代码中yield后面接的东西(任何),并暂停运行,意味着我们的next(f)运行完毕
在这里的代码中,函数开始执行时,打印'这里是第一步',进入循环,遇到yield暂停,因为返回值为'这是yield传入的内容',还有个print在外面,所以打印这一串字符串
4.运行下一个next(f)从刚刚暂停的地方,即yield开始(从它的下一行代码开始运行)继续运行,直到碰到下一个yield
在这里的代码中,从yield下一行开始,打印'这里是第二步',第一轮循环结束,进入下一轮循环,碰到下一个yield暂停,这里的返回值仍为'这是yield传入的内容',但没有print存在了,所以不再打印,至此,程序运行结束

f.send是什么情况:

next() 方法只能让生成器执行到下一个 yield,而 send() 方法不仅可以让生成器继续执行到下一个 yield,还可以向生成器发送一个值

注意:第一次调用 send() 时必须传入 None,因为此时生成器尚未暂停在 yield 处
我们上文说过启动生成器还可以用f.send(None)

def accumulator():
    total = 0
    while True:
        value = yield total
        total += value

f= accumulator()
print(next(f))      # 启动生成器,输出 0
print(f.send(1))    # 累加 1,输出 1
print(f.send(2))    # 累加 2,输出 3
print(f.send(3))    # 累加 3,输出 6

感受一下:
第一步:输出yield后面的total(此时为0)
第二步:send将1输入给yield,使value=1,下一行total加上value后为1,进入第二次循环,输出值为此时的total(为1)
第三步:同理,send将2输入给yield,使value=2,下一行total(为1)加上value后为3,进入第三次循环,输出值为此时的total(为3)
第四步:(自己推)

f.close是什么情况:

关闭生成器
一般用不到,如果是很多代码,为了便于维护可能会使用

后话:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值