Python中yield的用法(笔记)

Python中yield的用法(笔记)

我们只需要明白yeild关键字的用法以及两个调用方法的使用就ok

yeild的两个使用方法:

1.next()方法

这个方法在第一个例子中有讲解。

2.send()方法

这个方法在第二个例子中有讲解。

首先我们要先明白yeild关键字,yeild关键字可以看成一个return,同时它也是一个生成器(generator),yeild关键字在程序中出现时,会在当前行停止运行,下一次程序运行时,开始执行的代码是停止行的后一行代码。

1.下面我们看一段代码:

def test():
    print("test....")
    while True:
        num_back = yield 5
        print("num_back:",num_back)
num = test()
print(next(num))
print("*"*10)
print(next(num))

下面是上面代码的运行结果,我们来分析一下:

test....
5
**********
num_back: None
5

1.test函数中带有yeild关键字,所以,程序并不会真正的运行,而是相当于变换成了一个生成器num。

2.在遇到next()时,才会开始真正的去执行test函数,此时test函数先打印了一个test…结果,然后进入while循环体,当运行到yield时,此时num相当于一个生成器,所以我们用next方法获取结果,但是此时yeild的机制体现出来了,yield在next方法中只相当于return,所以此时给函数返回了一个5的结果,并不会给num_back赋值,并且代码运行到带有yeild这一行停止。

3.接着程序运行print("* "10),输出**********。

4.接着执行print(next(num)),此时程序时接着第二步里面代码停止的那一步开始运行,因为并没有给num_back赋值,所以此时num_back为None,然后接着进入循环体执行next,遇到yeild时,再次return一个5,程序停止运行。

2.第二段代码

def test():
    print("test...")
    while True:
        num_back = yield 5
        print("num_back:",num_back)
num = test()
print(next(num))
print("*"*10)
print(num.send(6))

我们看一下运行结果:

test....
5
**********
num_back: 6
5

这一段代码与上面讲解的前三个基本相同,不同的地方在哪?在num_back返回的值不同,对吧。这是因为send()方法,send方法在生成器中起到了两个作用,第一,先给yield关键字所在行赋值,第二,向下继续运行,相当于next的方法,即继续进入循环体然后return yield的所带的值。

代码讲解:
1-3略。详细的看第一个例子的1-3.

4.代码执行到print(num.send(6))时,先返回第三步停止的那一行,即num_back = yield 5,此时因为时send方法,所以先给num_back赋值,即num_back为6,再运行yield下一行,即print(“num_back:”,num_back),得到num_back: 6,然后继续进入循环体运行num_back = yield 5,此时发挥的作用是yield的另外一个功能,即return 关键字所带的值5,程序停止运行。

yield关键字解释到这里差不多就结束了,那么我们来做一个小测试。

def fab(max): 
    n, a, b = 0, 0, 1 
    while n < max: 
        yield b      # 使用 yield
        # print b 
        a, b = b, a + b 
        n = n + 1
 
for n in fab(5): 
    print n

现在来测试一下吧,不懂答案的可以运行一下程序。


版权声明:本文为zhiaichen原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。