python中的yield

一直不太清楚yield的用法 看了很多资料 他们讲的都很复杂 还是自己调试一下才好

首先带yield的函数其实不是真正意义上的函数 而是一个生成器  可以把yield理解为音乐播放器上面的暂停

和播放  执行到yield的时候程序暂停 返回后面的值 当再次调用的时候 程序从暂停的地方 开始运行

def bi():
    print("starting")
    while True:
        print("1.")
        res=yield 222
        print("2.res:",res)

print("3")
g=bi()
print("4")
print(next(g))
print("*"*10)
print("5")
print(next(g))

打印结果:

3
4
starting
1.
222
**********
5
2.res: None
1.
222

 

先把yield看做”return” 在程序中返回一个值,返回后程序就不往下运行了

程序开始时

先打印一个3 然后运行bi() 但是bi()函数里面有关键字yield 所以函数并不会真正的执行

先得到生成器g 

可以把g当成对象来看 接着打印一个4

直到调用了next方法 函数bi()开始运行 打印starting

进入到while中 打印1. 遇到了yield 把它看成return 但res并没有真正的赋值 返回了222  

函数bi()停止 打印分割线 接着打印5  再次调用next 程序从停止的地方继续 所以打出函数里面的第3条语句 但是res并没有值 所以为空 接着执行while循环 打印1.  遇到yield 打印”return 222” 

那么下面的print(“2.res:”,res)中的res永远没有值

所以yield和return的关系和区别,带yield的函数是一个生成器 而不是一个函数,但是这个生成器有一个next方法,作用是接着上一次停止的地方执行 遇到yield后 返回生成的数 结束

然后可以用send方法 发送一个值给res

def bi():
    print("starting")
    while True:
        print("1.")
        res=yield 222
        print("2.res:",res)

print("3")
g=bi()
print("4")
print(next(g))
print("*"*10)
print("5")
print(next(g))
print("*"*10)
print("*"*10)
print(g.send(100))

打印结果:

3
4
starting
1.
222
**********
5
2.res: None
1.
222
**********
**********
2.res: 100
1.
222

代码只是在后面加了3行

程序执行g.send(100) 程序会从关键字yield继续运行 send中包含next()方法 继续执行进入while循环 再次遇到yield  返回后面的值 程序暂停 直到再次调用next或者是send

 

利用yield是为了减少内存空间的使用 如果用range(100)的话 就生成了有100个数的list在内存里面  

for n in range(100):

       j=n

 

可能这个数更大 占用的内存空间就更大 

上一篇:正反选练习


下一篇:docker安装gitlab步骤