Python 相較於Java 而言,有什麼優勢?,python較於

來源:互聯網
上載者:User

Python 相較於Java 而言,有什麼優勢?,python較於

最近在後台,有很多的同學私聊我說,Python和Java.,哪個具有前景呢?今天我們就來簡單的講一下這兩者的區別:


我認為C, Java跟Python都是非常成功的語言, 具體選哪種看你的情境.

言歸正傳,來對比一個Python跟Java.

Python:
優點 :文法簡潔優美, 功能強大, 標準庫跟第三方庫灰常強大, 應用領域非常廣: vinta/awesome-python · GitHub(跟PHP形成宣明對比!)

語言方面, 舉幾個例子:

一切都是對象!!!
類(class本身)/函數/類方法是callable的對象
因為是對象,所以你當然可以傳來傳去啦. 比如:

class A:    def __init__(self):        print "init A"    def run(self):        print "run A"threading.Thread(target=A).start() #: 在另一個線程執行A()a = A()threading.Thread(target=a.run).start() #: 在另一個線程執行a.run() ... # 驚呆沒有,這是怎麼做到的?? 也許你該看看描述符的概念



List運算式(其他好多語言也有,但是我最喜歡python的寫法):
把"1023"變成 [1, 2, 3]

[ int(x) for x in "1023" if x != "0" ]

(當前你可以用Lisp風格的: map(int, filter(lambda x: x != "0", "1024")))

對dict也是類似:

adict = {"a":1, "b":2}{k: v*2 for k, v in adict.items() }


yield關鍵字:
當你需要返回很多東西然後一個一個用的時候, 你可以一次返回一個

def xrange(n):      i = 0      while i < n:          yield i          i += 1用法:for i in xrange(10):     print i


裝飾器@:
把something_heavy()返回的結果緩衝起來(以函數名+args為緩衝的索引值,只緩衝最近使用的10條)

@functool.lru_cache(10)def something_heavy(args):       #各種耗時操作.....       pass


運算子多載:
試試numpy, 你會驚呆的, 操作向量/矩陣跟基本類型一樣方便

缺點:


目測python是最慢的指令碼語言,比V8上的JS還慢不少. (研究一下描述符,你會發現python調用對象方法的開銷好大!)

但是python創始人說了, 一般程式的瓶頸在於20%的代碼, 所以你可以把那20%的代碼用C重寫(而python是膠水語言,用C重寫部分代碼當然很easy啦)

同時,你可以試試PyPy, 引入了JIT技術

動態類型
有人說: 動態類型寫時爽, 重構起來是災難(原諒我記不得原話..).

對於不寫unittest, 不做程式碼涵蓋範圍測試的人來說, 動態語言當然是危險的, 拼字錯誤都可能被隱藏, 重構?別搗亂!

python創始人有話說: "如果你認為編譯器可以幫你解決所有問題,那你一定幹編程沒多久" (鄙人深有體會,曾經年少輕狂的我非常鄙視javascript), "不管什麼程式,都需要寫testcase, 既然要寫testcase, 那麼動態類型不是問題!"

在此推薦大家兩個工具: py.test python-coverage

Java:


優點

用幾個詞形容一下Java語言: 優美, 嚴謹, 健壯,不易出錯.

當然, 使用也非常的廣泛: 常年盤踞編程人員數量熱門排行榜第一名!
各種庫也灰常多: akullpp/awesome-java · GitHub
同樣的代碼, 相比C++(甚至python), Java代碼出BUG的機率要小點(當然,寫的時候一般會比python長).

Java從語言設計上盡量避免了程式員犯錯, 比如自動記憶體回收, 拋棄無符號類型, 安全的枚舉, 編譯期泛型檢查(Java1.5之後加入的泛型,但是只是用來做編譯器檢查,運行時跟以前一樣), 強制的異常處理(遇到異常必須catch或者申明throws) 等等(當然,某些特性python也有.)

Java標準庫和好多第三方代碼都充斥著濃濃的設計感!!!, 各種設計模式到處可見. 從下面的語句可以看出一點來:

new BufferedInputStream(new FileInputStream(new File("somepath")))

尼瑪, 好多字, 看我的:
C:

fopen("somepath", "r")

Python:

open("somepath")

Java代碼多,但是API可複用行更強,選擇更多(我想一次讀完檔案,不要buffer呢?)

因為健壯安全,所以Java成了企業級背景標準. 想想銀行後台, 關鍵地方出點bug可不得了.

缺點:


要敲好多代碼, 參考上面的例子...


沒有Python那些奇葩特性, 靈活性不足,怎麼寫你還是Java, 而Python可以寫的像Javascript/Lisp/Matlab.....



簡單來說, Python是給人設計的(人生苦短,請用Python), C/C++更像是為機器設計的,
而Java則介於兩者之間.




著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
  • 本文已收錄於以下專欄:

相關文章

聯繫我們

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