python yield在for循环中的应用小记

yield是python的关键字,在本例子的for循环中,对于每轮循环,yield相当于一次return(其实是返回了一个生成器),循环每次执行到yield语句的位置时,返回yield后面的值,同时会记住本次循环进行到哪里(比如本例中,当 i 取值取到 2 ,下次 i 会继续往后循环,不会重复再取 1 ),下次进入循环时,会从yield的位置继续执行,直到循环条件不满足,结束。

下面结合这个例子进行说明:

运行这个py文件时,从上而下,先是两个函数的定义,然后从for循环开始是可执行的代码。

对 m 变量进行循环,m 的取值是通过yield_test()方法的返回值提供的,为了得到 m 的第一个值,看yield_test(5)的返回值是什么,此时程序执行到第一个方法,n=5,i 取值是range(5),也就是0,1,2,3,4,第一次循环,i 取值0,遇到yield语句,函数返回值是call(0) ,也就是0,此时,yield后面的语句不再执行,而是停在这里,等待下次进入循环时,再从这里开始。

这时0是 m 的第一个取值,开始执行最底下的for循环,打印“---------”和 m=0 ,第一次循环结束。

此时 m 该取第二个值了,再次进入上面yield_test()方法,从yield后面的语句开始执行,打印 i=0(上次循环结束时,i = 0),然后 i 继续取值 1 ,yield语句处call(1),等于2,此时yield_test(5)的返回值是2,也就是 m 的第二个取值。

同第一次一样,yield_test()里面的for循环停在了yield语句处,等待下次进入循环,从yield后面继续执行。m 获得第二个取值2后,执行循环体,打印“----------”和m=2,然后 m 去寻找下一个取值,再次进入上面的循环,从yield后面的语句开始执行。。。。。以此类推,直到最后一次。

最后一次i=4,yield语句处,call(4),等于8,也就是 m 取值为8,打印“--------”和m=8,之后,m再去寻找新值时,进入循环,从yield后面的print开始,打印 i=4,此时循环结束了,因为 i 已取到最后,然后执行yield_test(5)中,循环体外的打印语句print("do something.")和print("end.")。

至此,程序执行完毕。

猜你喜欢

转载自www.cnblogs.com/brigth-9V/p/9292836.html