孙行者定身术+时间机器-Generator in Python(序)

自以为在Python领域玩耍的时间挺长了(有近3年了吧),可是我还是错过了一个重量级的关键字:Yield。这也难怪,它代表一种特殊的东西:generator,并且还牵扯了一个重量级的名字:coroutine。这两个家伙对我而言都很陌生,再加上“Yield”这么一个诡异的名字,理解起来真是挺有难度。有几篇介绍它的技术文档,不知是作者笨还是我笨,我连续阅读了两遍还没有觉得自己真的懂了。我渐渐感觉到这里边不仅是是技术概念,甚至有编程新理念的挑战,我不得不倒空自己杯子里的水才能很好的装得下这一杯新的饮料。最后,还是limodou同志的一个小比喻点醒了我,再加上仔细阅读了Python的官方说明,终于打通了任督二脉。

花费了这九牛二虎之力得来的东西还真值,说醍醐灌顶是有点夸张的,但确实有点这样的味道。就因为这一点,我现在都有点不好意思再自称是出道10年的老家伙了。丢人呐!依稀记得某同志当年和我神侃coroutine的时候,我还完全没当回事,只当茶余饭后的聊资了呢。现在看来,那个同志比我先知先觉。

好了,回正题,说说这个新玩意儿。

函数(function)这东西,在座的各位只要写过程序的应该都熟悉。就拿C说事儿,函数定义有名称、参数列表、返回值,执行起来从第一行语句开始经过一连串的顺序、分支和循环结构,一路执行直到遇见return语句或是结尾的"}"为止,然后执行结束,离开。对吧?再往深了说一点无非就是进出调用栈的过程。传统的函数就是这样的。然而,coroutine不是的,它表面上看起来是一个function,可是它的行为大异。概括而言,coroutine可以有多个入口和多个出口。与传统function最大的不同在于,一个coroutine在每次被调用时是接着上一次的返回处开始的,而不是从函数的第一行!!!它每次被调用可能不是把全部代码执行完,执行一段就停下来并返回一个值,然后就停在那里等你下次再调用!!!隔路吧?

有没有感受到理念上的挑战?脾气大的可能已经骂出来了:“神马玩意儿!”稍安勿躁,我打个比方来解释一下。你一定看过西游记,孙悟空同学有一个特殊的本事,就是定身术,他看谁不顺眼,顺手一指说句“定”,那人就不能动了。这个coroutine就有这本事,跑几句代码就返回数据给调用者然后自己就定在那里不动了,下一次再被调用时就从被定住的地方接着跑。这多像好莱坞科幻电影中的时间机器啊,可以回到过去啊!!!

看到这里,功夫比较深的老家伙们估计已经看出端倪了,我猜你会说:“不就是把局部变量、运行指针等信息保存下来嘛!下次就可以接着用了,所以就像是被定住了又恢复了一样”。是的,就是这样的,实现层就是这样的!但其实当初最困扰我的不是实现层,而是应用层。为什么?为什么有这样的函数存在?有什么必要搞出这么一个”怪胎”?难道只用传统的函数不能解决问题吗?

原来,这表面的乱象背后果真掩藏着启人心智的编程理念!且听下回分解!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值