哪些語言特徵使得python指令碼可以如此短小?

來源:互聯網
上載者:User
原來很少用 python,現在用得越來越多,發現了很多 python 讓我驚喜的地方,其中之一就是指令碼短小精悍。為什麼呢?可以說是因為 python 具有 functional programming 的特點嗎?

回複內容:

  1. 設計目的不同。C++ / Java 本身是為了嚴肅工程設計的語言,而 Python / Perl 之所以稱為“指令碼語言”,因為它們設計就是作為指令碼,臨時執行一下的,通常還負責“膠合”其它程式協作完成任務。(雖然 Python 在各種指令碼語言裡是最偏向於工程的)
  2. 從這個設計目的推倒,那麼這些語言在執行一些常見功能的時候,肯定要更方便才好,否則人們直接用 Java / C++ 就可以了啊。所以 Bash 格外擅長調用和組合程式,Perl 特別擅長字串處理等。Python 相對普通一些,提供了一個相對短平快而方便書寫的文法以達到目的:
    1. “動態強型別”省略型別宣告。C++ 11 剛剛開始引入 auto 進行類型推導。當然後者對正確的保證更強一點。
    2. 內建豐富而高效的資料類型:array / list / dict。對比一下 new HashMap>().get("Key1").get("Key2") 什麼的……
    3. Python 較早引入了一些 FP 語言的元素,如 map / filter / apply / itertools,還有 lisp comprehension 和 generator [1] 這種大神器。對比 C++ 11 / Java 8 才引入 lambda 實在是……淚目。
    4. 標準庫,"battery included"。雖然在某些方面比 JRE 不如,比 C++ std lib 那個弱 X 還是可以自豪得笑的。
    5. 而且 Python 更強的是有 PyPI 和配套的 pip 工具,使得管理依賴項、自動安裝和更新變得像 Debian 系統包安裝一樣容易(這不是黑,真的)。Java 後來也算有了 Maven(鑒於需要手寫 XML,我還是認為這貨不是給人類使用的。Clojure 的 Leiningen 略好)。C++ 牆角哭去!
當然,如果題主真的打算誤入歧途尋找一下 THE LANGUAGE 的話,沒事可以圍觀一下 Ruby 和 Lisp 系語言……
忘記是 Paul Graham 還是誰說的了……每個語言最後都會變成一種 lisp 方言 :)

[1] http://www.dabeaz.com/generators/Generators.pdf 我覺得主要是:
  1. built in string, unicode, bytes, tuple, list, dict, set, etc.,外加運算子多載;
  2. for ... in statement;
  3. list comprehension;
  4. 其他的一些基礎設施,如zip()、map()、reduce()、包羅萬有的標準庫等等。
你要比較的可能是一些強型別的靜態語言,如C++, Java等。如果跟 ruby、haskell 比,不見得短小很多。那麼我們來跟 C++ 比一下。

個人感覺,自從C++11引進了那些新特性以來,包括匿名函數、range-based loop (for ... in)、auto,以及加強的 STL 等,python就顯得沒那麼『fancy』了。那麼,python 剩下最方便的使得它可以『短小』的特性有:

  1. list comprehension. 這個應該是最方便的吧?有時 C++ 為了初始一個 2^n 的數組,需要專門寫一個 for loop。在 python 裡面可以直接一個 list comprehension 搞定。但是如果濫用並多重嵌套,會使得可讀性很差。
  2. 方便的內建類型,比如 list 原生支援 slice,以及 dict/set 很方便 C++11 裡的 std::string 用起來略遜一籌,不過 std::unordered_map 已經基本上趕上 dict 了。
  3. named argument 以及 tuple 作為函數傳回型別,使得定義一個靈活的函數方便很多。
  4. 動態類型的語言可以更靈活,但是也更容易出錯。初學者很多時候都會栽在類型匹配上面。作為一個 C++ 出身的程式員,I know what I am doing,基本上比較容易一次編譯通過,同時也很容易找到文法出錯在哪(這裡要感謝 clang)。
  5. 豐富的函數庫。pypi 能直接安裝各種 package,並且有 numpy/scipy + matplotlib 等神器的存在,把 matlab 矩陣計算的便利也吸引了過來,也因此衍生出各種 domain package,比如 NLP, machine learning, network analysis, data mining .... 而 C++ 比起來似乎遜色很多(至少沒有一個統一、方便搜尋的 repo)
  6. 值得一提的是縮排來表示代碼塊。這裡有它的 pros & cons,的確比 {} 省不少 lines,不過也似乎更容易出錯一點。
1.動態類型
2.強大的內建資料類型:list,dict
3.first order function
4.list comprehension & corountine(雖然這個有爭議,不過官方說有就當他有吧)
5.library多得數不過來相比java來說:
(1)python支援函數式編程,不用寫個hello world就寫好幾行代碼。
(2)python沒有強型別約束,變數使用用事先申明,一個變數可以接受任何類型賦值。
(3)python中沒有java中的那麼多規範,比如不用寫getter,setter。python異常捕獲可以不申明捕獲異常類型。
(4)python支援運算子多載,java中只能寫成方法的形式比如BigDecimal中的那些方法。
(5)python中不使用{}來約束語句塊。
(6)python中的方法一般都設計設計成可以鏈式調用(官方庫大多有這個設計),而java中的官方庫基本都沒有這麼設計,而且javabean規範中好像也說setter傳回型別應該為void。
(7)python參數傳遞可以直接傳遞函數(萬物皆對象),而java只能傳遞對象(Method不是對象),Android中的大量callback直接導致代碼難看的要死!!!
(8)python函數參數支援預設值,而java中只能通過多態來實現;
(9)python支援lambda

等等。。。。


python唯一煩的應該是decode吧。難道不是自動gc和內建lib嗎?
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.