python生成器与协程

看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()方法为止。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值