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
现在来测试一下吧,不懂答案的可以运行一下程序。