python和Java爭鋒相對,初學者到底學習哪個好呢?

python和Java爭鋒相對,初學者到底學習哪個好呢?

python和Java爭鋒相對,初學者到底學習哪個好呢?下面這篇文章慢慢分析其中的奧秘。

1.難易度而言。python遠遠簡單于java。

2.開發速度。Python遠優於java

3.運行速度。java遠優於標準python,pypy和cython可以追趕java,但是兩者都沒有成熟到可以做項目的程度。

4.可用資源。java一抓一大把,python很少很少,尤其是中文資源。

5.穩定程度。python3和2不兼容,造成了一定程度上的混亂以及大批類庫失效。java由於有企業在背後支持所以穩定的多。

6.是否開源。python從開始就是完全開源的。Java由sun開發,但現在有GUN的Openjdk可用,所以不用擔心。

7.編譯還是解釋。兩者都是解釋型。

我理解,C好比手動擋車(編譯型語言),java和python(解釋型語言)好比自動檔車。跑的最快的車都是手動檔,但是對開不好的人來說,開自動檔反而更快些。

Kno有一篇文章談到選擇編程語言,“先確定你的需求”,不要由語言的簡單還是複雜去覺定。只有能夠編寫你真正認為有用的程式,才能獲得滿足感,學習才能繼續。

那麼java和python分別適用於什麼樣的環境呢。由sourceforge.net可以看出:

最著名,久經考驗的普通應用程序,基本都是c++寫的。例如emule,7-zip,WinSCP,FileZilla等等等。

一部分由java開發,例如最有名的OpenOffice。

python寫的很少,如Pidgin,FireBird。

開發語言(有多少個程式由此語言開發)的排行如下:

# Java46,202

# C++36,895

# PHP30,048

# C28,075

# C#13,476

# Python13,379

# JavaScript11,285

# Perl9,216

# Unix Shell3,869

# Delphi/Kylix3,548

# Visual Basic3,186

# Visual Basic .NET

很多框架和類庫也和應用軟件一樣在這個列表裡,因此比較公平。

由此可以看出,java不管在GNU還是商業領域都是應用最廣的語言。C主要用於構建系統底層。c++和java用於構建中間應用層。如果資源足夠,那麼會選擇c++開發,以求運行速度,否則會用java開發,以求開發速度。python在各方面都比java優秀,可謂次世代語言。可最受爭議的是它的速度,純python比java慢很多,以及背後沒有商業支持,穩定性備受詬病。目前為止,python在商業層次上,主要作為一種膠水語言,粘合其他語言(主要是c/c++)的類庫。在GNU領域,主要侷限於小規模的應用和個人化應用。以及逆向工程(黑客)應用。

為什麼java在服務器端被大量應用,在客戶端用的卻比較少呢。難道服務器端用到的計算量反而少麼。我認為這說明對比c++,java的速度還是可以接受的。無法被接受的是JRE平臺,以及JRE平臺啟動時卡的那一會兒。我就曾經為此認為java寫就的程式性能低下。

python用戶常常拿來說嘴的一點是:python並不慢,因為python運行時調用了大量c庫,而c是很快的。反過來想想,這正反映了其膠水語言的事實,任何一種語言都可以調用c庫,這麼比較有價值麼?假如一個庫完全由python,那麼它的運行效率...不說也罷。編程不能總是用別人的庫啊。

----

Python編程語言目前的使用中需要不斷的學習。下面我們就詳細的看看如何才能更好的進行相關知識的學習。最近我一直在看一個基於wxPython的GUI應用程序代碼,大概45.5KLOC的左右,而且這還不包括它所用到的庫(如Twisted)。

代碼是由那些對Python比較生疏的Java的開發者寫的,所以它存在很嚴重的性能問題(如三十秒的啟動時間)。在檢查代碼的時候,我發現他們寫了很多在Java中能講得通但是對Python編程語言來說去卻是很難接受的東西。並不是因為“Python比Java慢”,而是因為在Python中有更方便的方法去完成同樣的目標,甚至是在Java中不可能的事情。

所以,令人難過的事就是這些傢伙事倍功半,寫的那些代碼比本應合乎用Python編程語言實現的慢很多。下面,讓我們來看一些例子:

◆Java中的靜態方法不能翻譯成Python的類方法。哦,當然,他多多少少也能產生同樣的效果,但類方法的目的實際上是做一些通常在Java中甚至都不可能的事情(如繼承一個非默認的默認函數)。Java靜態方法慣用的翻譯通常翻譯成一個模塊級的函數,而不是一個類方法或靜態方法。(並且靜態常量應該翻譯成模塊級常量.)

這不是性能上的問題,但是一個Python編程語言程序員如果想調用Foo.someMethod,他要是被迫採用像Java中Foo.Foo.someMethod的方式去做的話,那麼他就會被逼瘋的。有一點一定要注意:調用一個類方法需要一個額外的存儲空間,而調用靜態方法或函數就不需要這樣.

對了,還有就是這些Foo.Bar.Baz的屬性鏈也不是自己就能數出來的.在Java中,這些帶點的名稱是有編譯器來查找的,運行的時候並不會去考慮一共有多少.而在Python中,查找的過程是在運行時進行的,所以要包括每個點.(在Python中,要記住一點,"平鋪的結構別嵌套的要好",儘管相對於從性能方面來說,可能它更多涉及的是"可讀性"和"簡單要比複雜好".)

◆要使用switch語句嗎?Python編程語言將是一個哈希表,不是一堆if-then語句。要使用在Java中不是switch語句而且還有字符串參與了的一堆if-then語句嗎?它將仍然是一個哈希表。CPython字典是用在我們所瞭解的領域中認為是最佳性能之一的哈希表來實現的。你自己所寫的代碼也不會比這個再好了,除非你是Guido、Tim Peters和Raymond Hettinger的私生子,而且還是遺傳增強了的。

◆XML不是答案。它也不是一個問題。現在用正則表達式來解釋Jamie Zawinski,“一些人,當他遇到一個問題的時候,就會想‘我知道,我要用XML.’那麼他們就有兩個問題了。”

相對於在Java中來說這是個不同的情況,因為比起Java代碼,XML是靈活而且有彈性的。但比起Python的代碼來,XML就是一個船錨,一個累贅。在Python中,XML是用來協同工作的,而不是你的核心功能,因為你不需要那麼做。在Java中,XML可能是你的救世主,因為它讓你實現了特定領域的語言並且“不用編碼”就提高你的應用程序的適應性。在Java中,避免編碼是一個很大的優勢,因為編碼意味著重新編譯。但在Python中,通常是,寫代碼比寫XML更簡單。還有就是Python處理代碼要比處理XML快很多很多。(不僅僅是這個,你必須寫XML處理代碼,同時Python就已經為你寫好了.)

如果你是一個Java程序員,你並不能利用本能知覺來考慮你是否要在你的Python核心應用中使用XML作為一部分。如果你不是因為信息交互的原因去實現一個已經存在的XML標準或是建立某種輸入、輸出格式或者建立某種XML編輯器或處理工具,那麼就不要這麼做。根本不要去這麼做。甚至連想都不要想。現在,丟掉那個XML模式然後把你的手解放出來吧!如果你的應用程序或者平臺要被Python編程語言開發者使用,他們只會感謝你不要在他們的工作中添加使用XML的負擔。

(這裡唯一的例外是如果你的客戶(your target audience)確確實實因為某些原因而需要使用XML。就好像,他們拒絕學習Python但如果你使用XML他們就給你付錢,或者你打算給他們一個很棒的能編輯XML的GUI,還有就是這個XML的GUI是另一個人寫的,同時你得到免費使用的權利。還有一些很少見的架構上的原因需要用到XML。相信我,它們不會應用到你的程序中去的。如果有疑問,對一個資深的Python開發員解釋你的用例。或者,如果你臉皮厚而且不介意被人嘲笑的話,試試向一個Lisp程序解釋你的程序為什麼要用XML!)

python和Java爭鋒相對,初學者到底學習哪個好呢?

◆Getter和setter是惡魔。我應該說它是惡魔,是魔鬼!Python編程語言對象不是Java Bean。不要寫什麼getter和setter,而是還把它們內置在“屬性”裡面。它直到你能證明你需要比一個簡單訪問複雜一點的功能時才有意義,要不然,不要寫getter和setter。它們是CPU時間的浪費,更要緊的是,它們還是程序員寶貴時間的浪費。不僅僅對於寫代碼和測試的人,對於那些要閱讀和理解它們的人也是。

在Java中,你必須使用getter和setter,因為公共字段不允許你以後改變想法再去使用getter和setter。所以,在Java中你最好事先避開這些"家務雜事".在Python中,這樣做很傻,因為你可以以一個普通特性開始並可以在任何時間改變你的想法,而不用影響到這個類的任何客戶。所以不要寫getter和setter方法。

◆代碼重複在Java中通常來說就是一場不可避免的災禍,你必須經常反覆地寫同一個方法而只有一點點的變化(通常是這是因為靜態類型約束)。在Python中這樣做是沒有必要的也是不值得的(除了極少數一些特定的場合需要內聯一些要求性能的函數)。如果你發現自己一遍一遍在寫同樣的代碼而且變化很少,你就需要去學一下閉包。他們實際不併是那麼可怕。

  • 對Python編程技巧大總結

  • 簡讀靈活性的Python編程語言

  • 短時間內掌握Python編程語言

  • 對Python編程語言歷史說明介紹

  • 有關Python編程語言進行描述

這就是你要做的。你寫了一個包含了函數的函數。這裡內部的函數就是你要一遍遍寫的函數的模版,但是在裡面加入了針對不同情況的函數要使用變量。外部的函數需要剛剛提高的那種變量作為參數,並且將內部的函數作為結果返回。然後,每次你要寫另一種略微不同的函數的時候,你只要調用這個外部的函數,並且把返回值賦給你要讓“重複”函數出現的名字。現在,如果你需要改變這個工作方式,你只需要改變一個地方:這個模版。

在我所看過的應用程序/平臺中,只有一個很微不足道的程序使用了這個技術,它去掉了數百行重負的代碼。實際上,因為開發者使用了特別的樣板文件來為這個平臺開發插件,所以這會節省很多很多第三方開發人員的代碼,同時也使那些程序員要學習的東西變得簡單了。

這只是Java->Python編程語言思維方式轉變的冰山一角而已,現在我能正確的轉變而不用去鑽研程序的細節。本質上,如果你曾經用過一段時間Java,而且對Python比較陌生,那麼你不要太相信自己的本能。你的本能已經被Java調節,而不是Python。向後退一步來說,最重要的是不要再寫這麼多代碼了。

為了這樣做,讓自己覺得更加需要Python。假裝好像Python是可以做任何你想做的魔棒,而你無須出一點力。問一下,“Python怎樣解決我的問題?”還有“Python語言的哪個特點和我的問題最相似?”如果對於你需要的東西其實已經有了某種固定形式,那麼你絕對會感到驚訝的。事實上,這種現象實在是太普遍了,甚至即使在很有經驗的Python程序員中也會出現,以至於Python社區中給這種現象起了個名字。我們稱之為“GUIDO的時間機器”,因為在我們自己還沒有掌握它之前,通常看上去要得到我們所需要的東西好像那是唯一的方法。

所以,如果你在使用Python編程語言時候不能感到比使用Java要至少多出10倍的生產力話,你就最好做一下改動,你是不是忘記使用time machine!(chances are good that you've been forgetting to use the time machine)(同時如果你還懷念你的Java IDE,你可以這樣想:因為你寫的Python程序比他所需要的要複雜得多.)

昨天更新了一篇文章,後臺有一位讀者給我留言說,想讓我寫一篇Python和傳統語言的區別,今天我就給大家講一下Python和Java的故事。

我先問大家一個問題,為什麼中國人用刀叉是很容易上手的一件事情,而外國人用筷子,應該是他們在中國吃飯時最痛苦的一件事情吧。為什麼會這樣呢?

其實原因非常簡單,當我們學會了一門技術難度要求更高的技能以後,再去降級學習難度更低的技能是非常容易的一件事情,反之則不然。

python和Java爭鋒相對,初學者到底學習哪個好呢?

python和Java爭鋒相對,初學者到底學習哪個好呢?

python和Java爭鋒相對,初學者到底學習哪個好呢?

這個道理同樣適用於我們的學習,我對Java和Python都有較為豐富的使用經驗,當然,Java的應用經驗更豐富,代碼量比Python更多一些。正是由於我們豐富的Java經驗,當xx學院學院的軟件測試方向需要為學生講授Python課程時,我們所有的講師都會被分配任務去研究Python,並完成教案編寫,教材編寫,案例編寫。我們會發現,使用Python是一件非常容易的事情。基本上來說,解決問題的方式,方法,算法,思路,所有的編程語言都一樣。我們去學習一門新的編程語言的時候就會容易很多,只需要關注與我們所熟悉的編程語言在語法和使用上存在哪些方面的不同即可。

那麼問題來了?

xx學院也要講授Python,那到底是Python值得學習還是Java呢?

這裡面有三點我必須說破,卻很少有人從這個角度來給大家做分析:

  1. 如果一個不懂2-3門編程語言的人,或者很少使用到Java或者Python,來告訴你Java好還是Python好,這是赤裸裸的不負責任。如果這個人用Python並且混得還稍微可以,他一定會告訴你Python好,如果這個人用Java,他一定會告訴你用Java好。如果兩個語言都沒有用過的鍵盤俠,他會告訴你語言都是相通的,不要糾結。每一個人都說得好有道理的樣子,於是讓你無從選擇。我熟練使用8種以上的編程語言,所以才稍微感覺有點資格,來說一說這兩門編程語言。雖然,從我個人的角度在我心目中,編程語言只有三種,第一種是Java/C/Python,第二種是其它。但是我不能通過這種偏激的方式來誤導大家。

  2. 我們必須要明白Java和Python的各自定位。Java源自C和C++的技術體系,於1995年推出,定位於給專門的程序員設計大型的複雜分佈式應用而設計。而Python是1991年推出(比Java還早)主要面向於系統管理,科研,教育和非程序員群體等。大家一定要理解清楚一個現實,這個世界上並不是只有程序員才需要寫程序,還有很多群體需要寫程序。比如xx學院在這方面的定位就很清楚:Java開發全棧方向的學生學習Java編程和JavaScript編程,軟件測試方向的就業班學員學習Python(因為他們並非專業的程序員群體),而軟件測試方向下屬的自動化測試開發高級研修班,是Java/Python兩個方向同時存在。那你說你覺得哪個更好呢?

  3. Python比Java早4年出身,但是在國內為什麼幾乎到2010年之後,Python才逐漸火起來呢?原因很簡單,因為我們都太現實了。由於大數據的盛行,由於自動化測試方面的人才需求,以及對於互聯網的一些基礎應用系統的的開發,企業加大了對Python人才的招聘力度(當然,與Java比還有較大的差距),由於有一門感覺很簡單又能賺大錢的編程語言出現了,簡直是人類的福音啊,所以火起來了。這一點與近幾年虛火很旺的Web前端開發很像,其實絕大部分人沒什麼技術能力,但是工資卻拿得不錯。這不是個人的原因,企業也很浮躁,僅此而已,一旦虛火洩了,誰能撐到最後?請各位自行腦補。

python和Java爭鋒相對,初學者到底學習哪個好呢?

一方面,Python上手的確相對要快一點而已,僅此而已。解決複雜問題時,沒有人會覺得難點在使用哪門編程語言上,而是解決這個具體問題的算法思路上。這一點各位務必要拎清這個思路。另外一方面,由於Python近幾年的火爆,不排除一些人故意散播一些言論,來誤導大家使用Python。這件事情就像這麼多年,一直有人覺得學習軟件測試要容易一些一樣,很多人也是報著通過軟件測試進入這個行業,選擇了一個自己認為沒有難度的領域進入。但是,我發現,當3,5年過去了,很多測試人員目前最焦慮的就是,自己技術不夠深,在企業當中越來越沒有競爭力了。所以最終,還是得硬著頭皮研究深層次的測試技術,無論是編程,網絡,數據庫,協議,還是自動化測試,性能測試等。但是這個過程非常痛苦,就像我說的那樣,這個世界上99%的人都會選擇一條容易走的大路,因為懶惰,因為恐懼。而成功是屬於那1%的人一樣。這句話同樣適用於編程語言或者技術功底的訓練上。

其實大家如果有過實際的編程經驗,我們不妨認真想想,當我們研發一個系統的時候,究竟會用到哪些技術?

那些什麼需求分析,跟測試撕逼,跟客戶撕逼,跟老闆撕逼的那些爛事我們就不提了。我們就來看看純技術層面的一些基本要求:數據庫,Linux命令,網絡協議,接口設計,算法思路,框架,改BUG,編程,前端交互。你應該懂我,利用不同的編程語言編寫程序只是研發過程中眾多你需要掌握的技術當中的一塊而已。其它,與你用哪們編程語言無關,這一點如果你都理解不了,覺得我在忽悠你的話,那請自便吧。或者換一個角度,會一門編程語言,而不是完整技術體系,就能當技術大牛的情況,我覺得可能只有在你們家村裡可以行得通,因為就你一個人懂。

python和Java爭鋒相對,初學者到底學習哪個好呢?

python和Java爭鋒相對,初學者到底學習哪個好呢?

當然,以上我們討論是的純粹的基於技術定位,你也許可以反駁我說,難道做測試的都得懂編程,難道做Python的都不行?

這當然不是這樣的,任何一個領域都有大神,隨著經驗的豐富都能夠解決很多難題。但是,那是很久以後的事了,我們現在討論的是,你還在糾結Java還是Python的這件事,毫無疑問,這個時候,你仍然還是一個菜鳥,甚至連門都沒入。我建議大家,不要因為什麼事情簡單,所以我要去做,無論是學習編程語言,還是其它,這是最要命的一個出發點,會毀了你的未來。

文章最後,老樣子,繼續給大家帶來Python日常學習小技巧,今天給大家講下Python的字符串。

日常使用python經常要對文本進行處理,無論是爬蟲的數據解析,還是大數據的文本清洗,還是普通文件的處理,都是要用到字符串. Python對字符串的處理內置了很多高效的函數,非常方便功能很強大.下面是我總結的常用的7招,有了這幾招就能輕鬆應對字符串處理.

1.字符串的連接和合並

連接和合並

  • 相加 //兩個字符串可以很方便的通過'+'連接起來

python和Java爭鋒相對,初學者到底學習哪個好呢?

  • 合併//用join方法

python和Java爭鋒相對,初學者到底學習哪個好呢?

2.字符串的切片和相乘

  • 相乘//比如寫代碼的時候要分隔符,用python很容易實現

line='*'*30

print(line)

>>******************************

  • 切片

python和Java爭鋒相對,初學者到底學習哪個好呢?

3.字符串的分割

  • 普通的分割,用split

    split只能做非常簡單的分割,而且不支持多個分隔

phone='400-800-800-1234'

print(phone.split('-'))

>>['400', '800', '800', '1234']

  • 複雜的分割

    r表示不轉義,分隔符可以是;或者,或者空格後面跟0個多個額外的空格,然後按照這個模式去分割

python和Java爭鋒相對,初學者到底學習哪個好呢?

4.字符串的開頭和結尾的處理

比方我們要查一個文件的名字是以什麼開頭或者什麼結尾

filename='trace.h'

print(filename.endswith('h'))

>>True

print(filename.startswith('trace'))

>>True

5.字符串的查找和匹配

  • 一般查找

    我們可以很方便的在長的字符串裡面查找子字符串,會返回子字符串所在位置的索引, 若找不到返回-1

python和Java爭鋒相對,初學者到底學習哪個好呢?

  • 複雜的匹配

python和Java爭鋒相對,初學者到底學習哪個好呢?

6.字符串的替換

  • 普通的替換//用replace就可以

python和Java爭鋒相對,初學者到底學習哪個好呢?

複雜的替換//若要處理複雜的或者多個的替換,需要用到re模塊的sub函數

python和Java爭鋒相對,初學者到底學習哪個好呢?

7.字符串中去掉一些字符

  • 去除空格//對文本處理的時候比如從文件中讀取一行,然後需要去除每一行的兩側的空格,table或者是換行符

    line=' Congratulations, you guessed it. '

    print(line.strip())

    >>Congratulations, you guessed it.

python和Java初學者到底學習哪個好呢?就我而言,初學者選擇學習Python比較好的,Python語言簡潔,容易上手,就業比較廣,待遇也不錯,所以我認為初學者選擇學習Python是不錯的選擇。

好了,今天的知識就分享到這裡,歡迎關注愛編程的南風,私信關鍵詞:學習資料,獲取更多學習資源,如果文章對你有有幫助,請收藏關注,在今後與你分享更多學習python的文章。同時歡迎在下面評論區留言如何學習python。


分享到:


相關文章: