作為一個數年C/Java/Python混合開發者, 我談談我的感受.
我認為C, Java跟Python都是非常成功的語言, 具體選哪種看你的場景.
言歸正傳,來對比一個Python跟Java.
Python:
優點 ( 知乎怎么不能把這行字變大點??):
語法簡潔優美, 功能強大, 標準庫跟第三方庫灰常強大, 應用領域非常廣: vinta/awesome-python · GitHub(跟PHP形成宣明對比!)
語言方面, 舉幾個例子:
一切都是對象!!!
類(class本身)/函數/類方法是callable的對象
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誰勝一籌?
掃碼匿名提建議
直達CEO信箱