孫行者定身術+時間機器-Generator in Python(序)

自以爲在Python領域玩耍的時間挺長了(有近3年了吧),可是我還是錯過了一個重量級的關鍵字:Yield。這也難怪,它代表一種特殊的東西:generator,並且還牽扯了一個重量級的名字:coroutine。這兩個傢伙對我而言都很陌生,再加上“Yield”這麼一個詭異的名字,理解起來真是挺有難度。有幾篇介紹它的技術文檔,不知是作者笨還是我笨,我連續閱讀了兩遍還沒有覺得自己真的懂了。我漸漸感覺到這裏邊不僅是是技術概念,甚至有編程新理念的挑戰,我不得不倒空自己杯子裏的水才能很好的裝得下這一杯新的飲料。最後,還是limodou同志的一個小比喻點醒了我,再加上仔細閱讀了Python的官方說明,終於打通了任督二脈。

花費了這九牛二虎之力得來的東西還真值,說醍醐灌頂是有點誇張的,但確實有點這樣的味道。就因爲這一點,我現在都有點不好意思再自稱是出道10年的老傢伙了。丟人吶!依稀記得某同志當年和我神侃coroutine的時候,我還完全沒當回事,只當茶餘飯後的聊資了呢。現在看來,那個同志比我先知先覺。

好了,回正題,說說這個新玩意兒。

函數(function)這東西,在座的各位只要寫過程序的應該都熟悉。就拿C說事兒,函數定義有名稱、參數列表、返回值,執行起來從第一行語句開始經過一連串的順序、分支和循環結構,一路執行直到遇見return語句或是結尾的"}"爲止,然後執行結束,離開。對吧?再往深了說一點無非就是進出調用棧的過程。傳統的函數就是這樣的。然而,coroutine不是的,它表面上看起來是一個function,可是它的行爲大異。概括而言,coroutine可以有多個入口和多個出口。與傳統function最大的不同在於,一個coroutine在每次被調用時是接着上一次的返回處開始的,而不是從函數的第一行!!!它每次被調用可能不是把全部代碼執行完,執行一段就停下來並返回一個值,然後就停在那裏等你下次再調用!!!隔路吧?

有沒有感受到理念上的挑戰?脾氣大的可能已經罵出來了:“神馬玩意兒!”稍安勿躁,我打個比方來解釋一下。你一定看過西遊記,孫悟空同學有一個特殊的本事,就是定身術,他看誰不順眼,順手一指說句“定”,那人就不能動了。這個coroutine就有這本事,跑幾句代碼就返回數據給調用者然後自己就定在那裏不動了,下一次再被調用時就從被定住的地方接着跑。這多像好萊塢科幻電影中的時間機器啊,可以回到過去啊!!!

看到這裏,功夫比較深的老傢伙們估計已經看出端倪了,我猜你會說:“不就是把局部變量、運行指針等信息保存下來嘛!下次就可以接着用了,所以就像是被定住了又恢復了一樣”。是的,就是這樣的,實現層就是這樣的!但其實當初最困擾我的不是實現層,而是應用層。爲什麼?爲什麼有這樣的函數存在?有什麼必要搞出這麼一個”怪胎”?難道只用傳統的函數不能解決問題嗎?

原來,這表面的亂象背後果真掩藏着啓人心智的編程理念!且聽下回分解!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章