看python参考手册,发现二者有趣实例,特贴之与大伙分享。
使用yield语句可以让函数生成一个结果序列,而不仅仅是一个值。这样的方法也优于生存一个list。
直接上例子:
def countdown(n):
print "Counting down!"
while n > 0:
yield n
n -= 1
c = countdown(5)
print 'nothing happened at this moment!'
print c.next()
print c.next()
print c.next()
我们可以看出,在首次调用countdown函数时,并没有打印‘nothing happened at this moment!’这句话,说明函数并没有执行,而当首次执行next操作时候才会执行到此。next()调用使生成器函数一直运行到下一条yield语句为止。
生成器是基于处理管道、流或数据流编写程序的一种极其强大的方式。此外,TinyZ在他的博客中提及如何利用yield编写帅气的fibonacci,还是直接看代码吧:
def fib():
first, second=0, 1
while 1:
yield second
first, second= second, first+second
f = fib()
print "nothing happened at this moment!"
for i in range(10):
print f.next()
此例让我们发现yield强大的流式编写,此外也解决了python如何处理静态成员变量问题。tinyZ在博客中提到,若用C语言编写多个fibonacci序列,则需建立多个函数,否则无法解决静态成员变量问题,而python可以巧妙应用多创建几个同类型对象解决这个问题。
在看完了yield之后,我们下面可以考虑协程的问题。
通常,函数运行时要使用一组输入参数,但是也可以把函数编写成一个任务,从而能处理发送给它的一系列输入。这类函数称为协程。上代码:
def print_match(matchtext):
print "Looking for",matchtext
while True:
line = (yield)
if matchtext in line:
print line
matcher = print_match("python")
matcher.next()
matcher.send("python is good")
matcher.send("java is good")
matcher.close()
上例的过程会一直持续下去,matcher一直等待send给它传递参数,采用轮询方式等待,知道协程函数返回或者调用它的close()方法为止。