為什麼俺推薦Python[2]:作為動態語言的Python

來源:互聯網
上載者:User
文章目錄
  • ◇順應大趨勢
  • ◇瞭解新思維、新理念
  • ◇能夠化繁為簡

上次的文章介紹了指令碼語言的優缺點,然後又拿Python和其它指令碼語言PK了一下。今天主要是忽悠一下動態語言,捎帶忽悠一下Python。如果你看完本貼,覺得動態語言不錯,那俺建議你從Python開始入手。

★動態語言掃盲

  考慮到還有很多同學對動態語言瞭解不深入,有必要先來普及一下它的基本常識。已經瞭解的同學,請略過本節。
  通俗地說:能夠在運行時修改自身程式結構的語言,就屬於動態語言。那怎樣才算是“運行時修改自身程式結構”捏?比如下面這幾個例子都 算:在運行時給某個類增加成員函數及成員變數;在運行時改變某個類的父類;在運行時建立出某個函數......
  從這些例子,你應該對動態語言有一個初步的感覺了吧?畢竟傳統的靜態語言(比如C、C++、Java),是很難達到這些效果滴。
  另外,有個誤區需要澄清一下。很多同學以為指令碼語言也就是動態語言。其實兩者是不等價滴——雖然兩者有很大的交集。比如C#在4.0之後,就可以算是動態語言了,但它不能算是指令碼語言;另外,有很多Shell指令碼語言(比如DOS & Windows下的bat),不能算是動態語言。
  關於動態語言更深入的介紹,大伙兒可以看“這裡”。

★為啥要學習動態語言?

  掃盲之後,就該來說一下,學習動態語言的動機了。搞明白動機,學起來才有幹勁嘛

◇順應大趨勢

  假如你經常關注TIOBE的排名,那你應該能察覺出來,動態語言近兩年的發展勢頭比較迅猛(在Top10裡面,至少佔了半壁江山)。這能從某個側面反映出動態語言的影響力在擴大。
  假使你不相信TIOBE的排名,俺再舉一個例子。兩大開發陣營(Java和dotNet)最近幾年也加大了對動態語言的支援力度。比如,dotNet的CLR加入了對IronPython和IronRuby的支援;Sun當然也不甘示弱,JVM也開始支援Groovy,JRuby等語言。
  俺費了這許多口水,列位看官應該明白動態語言是大勢所趨吧。在這動態語言大行其道的日子裡,你如果連一門動態語言都沒搞懂,那出門都不好意思跟人打招呼。
  不過,話又說回來,靜態語言也是不會消亡滴。畢竟,靜態語言有自己的優勢(比如嚴謹、效能)。長期來說,必定是動態語言和靜態語言並存。各自彌補對方的缺點。

◇瞭解新思維、新理念

  學習一門動態語言還有一個好處:。有很多時候,多學習一門語言,並不一定是為了在工作中用它,而是為了學習新的思維方式、體會新的理念。比如俺就曾經花時間去看Prolog,但是俺在工作中,從來不需要用到它。(以後有空的話,俺會介紹一下這玩意兒)
  由於動態語言可以在運行時修改自身結構,因此就會產生很多靜態語言所沒有編程範式和手法(比如eval、Mixin,後面會順帶介紹這兩個玩意兒)。如果你以前只使用靜態語言,那你在學習了動態語言之後,多半會從它身上領略到很多新的思想和理念。

◇能夠化繁為簡

  可能有些同學覺得,前面說的都有些務虛,那咱再來說點具體實在的。大牛Edsger Dijkstra(圖靈獎得主)曾經說過:“編程的藝術就是處理複雜性的藝術。”咱們來看看,動態語言是如何處理複雜問題滴。
  假設要你實現一個函數,用來完成兩個數的某種運算,具體的運算類型作為函數的參數傳入,然後該函數返回運算結果。比如:

  Foo("+", 2, 4) 返回 6
  Foo("*", 2, 2) 返回 4

  對於上述需求,你會如何?捏?
  請先暗自盤算1分鐘,然後再往下看。

  ......
  Thinking
  ......

  如果你用靜態語言(比如C、C++、Java)來實現,你可能會在函數內使用一個switch,根據不同的運算子,進行計算,然後返回計算結果。
  對於某些比較OO的語言(例如C++、Java),你或許還會抽象出一個運算的介面類(純虛類),然後分別派生出若干個不同的計算類(比如加法類、乘法類),看起來似乎比switch要優雅一些。
  當然,用靜態語言還有其它一些玩法,但是代碼量都不會少。具體詳情可以看很早以前的一個老故事:4個程式員的一天。(其實俺這個例子的靈感就是從那個老故事剽竊滴)

  現在,咱們來看看Python是如何?該需求滴。用Python只需要兩行代碼即可。請看:

def Foo(op, n1, n2) :    return eval( "%d %s %d" % (n1, op, n2) )

  不懂Python的同學可能要問了,這兩行代碼是啥子意思呀?
  其實,第一行代碼只不過是定義了一個函數頭,第2行代碼才是精華。這裡面利用了動態語言常見的eval手法(具體參見“這裡”)。在python裡面,內建的eval函數可以把某個字串當成一個運算式,並對其求值。而語句
"%d %s %d" % (n1, op, n2) 只不過格式化出一個運算式的字串。
  順便再插一句,Python還有一個exec的內建函數,可以把一段Python原始碼作為字串參數傳遞給它,讓該函數去執行。兩個函數結合起來,就能玩出很多花樣。具體的花樣可以參見“這裡”

★為什麼是Python?

  說了動態語言的種種好話,有同學會問了,動態語言有很多種,為啥非要學習Python捏?
  首先,俺在本系列的上一個文章,已經對比過Python和另外幾種指令碼語言。那幾種指令碼語言正好也是知名的動態語言。Python相對於他們的優勢,此處就不再重複囉嗦了。
  其次,單就文法本身而言,Python的文法對動態性的支援是很優雅、很簡潔滴。通過剛才那個eval小例子,大夥應該已經看出來了。為了更形象一點,咱拿前面提到的Mixin來Show一下Python的文法是如何的簡潔。
  通俗地說,Mixin手法需要在運行時給某個類增加基類(也就是父類)。對於Python而言,每一個類都有一個內建屬性“__bases__”,裡麵包含這個類當前的所有基類。假如要在運行時增加基類,操作“__bases__”這個屬性即可。
  比如有一個類A和類B。如果要在運行時把B加為A的父類,可以用如下語句:
A.__bases__ += (B, )
  是不是也很簡潔,而且可讀性也不差?相比而言,有些動態語言(比如JavaScript),要實作類別似的效果,代碼就相對複雜了。
  由於Mixin不是今天的重點,就不再深入展開了。

  最後,來個總結髮言:如果你之前沒有接觸過動態語言,建議去學習一下;如果你已經打定主意要學,Python是比較好的候選者。
  好了,今天就聊到這裡。下一個文章,咱們來講講Python作為一個純粹的物件導向語言,有些啥特色。

回到本系列的目錄

著作權聲明
本部落格所有的原創文章,作者皆保留著作權。轉載必須包含本聲明,保持本文完整,並以超連結形式註明作者編程隨想和本文原始地址:

http://program-think.blogspot.com/2009/08/why-choose-python-2-dynamic.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.