java和Python的這場紛爭,誰才是最終的人生贏家

金羅老師發表於2018-12-02

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

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

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

java和Python的這場紛爭,誰才是最終的人生贏家

java和Python的這場紛爭,誰才是最終的人生贏家

java和Python的這場紛爭,誰才是最終的人生贏家

這個道理同樣適用於我們的學習,我對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前端開發很像,其實絕大部分人沒什麼技術能力,但是工資卻拿得不錯。這不是個人的原因,企業也很浮躁,僅此而已,一旦虛火洩了,誰能撐到最後?請各位自行腦補。

java和Python的這場紛爭,誰才是最終的人生贏家

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

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

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

java和Python的這場紛爭,誰才是最終的人生贏家

java和Python的這場紛爭,誰才是最終的人生贏家

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

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

下面我給大家列出一段我分別使用Java和Python寫的傳送一個HTTP協議的一段程式碼。這段程式碼收錄在我今年年底即將出版的一本自動化測試開發的高階教程裡面,全書均採用Java進行程式碼演示,明年,我會有一本幾乎一模一樣的但是是使用Python進行程式碼實現的書。之所以能夠這樣,原因很簡單,Java能解決的基本問題,Python也能解決,當然,Python能解決的,Java一樣可以。但是在乾重活兒方面呢,Java更成熟一些。

Java的程式碼,實現Agileone系統的需求提案新增功能:

// 實現需求提案的新增
public void doAdd() {
 // 先傳送POST請求實現登入 String postUrl1 = "http://localhost/agileone/index.php/common/login";
 String postData1 = "username=admin&password=admin&savelogin=true"; String resp1 = hr.sendPost(postUrl1, postData1); System.out.println(resp1); // 對sendPost()方法進行了額外的封裝,一次封裝,處處使用 // 再傳送POST請求完成新增 String postUrl2 = "http://localhost/agileone/index.php/proposal/add";
 String postData2 = "type=Enhancement&importance=Medium&" + "headline=&" + "content=這是用於Java程式碼測試的內容-10009&processresult="; String resp2 = hr.sendPost(postUrl2, postData2); System.out.println(resp2); }

我們再來看看Python實現同樣功能的程式碼:

# 匯入urllib和http庫
import urllib
import http.cookiejar# 利用cookiejar自動管理整個過程中的Cookie
 cj = http.cookiejar.CookieJar()
 opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj)) # 利用urllib構造POST請求並處理登入
 logindata = { "username" : 'admin', "password": 'admin', "savelogin" : "true" }
 data_encoded = urllib.parse.urlencode(logindata).encode('utf-8')login = opener.open("http://localhost/agileone/index.php/common/login/", data_encoded)print(login.read()) # 傳送Post請求提交新增需求提案
 proposaldata = {"type":"Requirement", "importance":"medium",
 "headline":"Headline from Python - 10010",
 "content":"Content from Python - 10010", "scope":"1","processresult":""}
 data_encoded = urllib.parse.urlencode(proposaldata).encode('utf-8')
 proposal = opener.open("http://localhost/agileone/index.php/proposal/add", data_encoded)
 print(proposal.read())

java和Python的這場紛爭,誰才是最終的人生贏家

相信大家很難區分所謂的簡單與難。因為程式碼幾乎都很類似,這種情況發生在很多場景,解決很多問題時都是一樣的。其實很多人之所以宣傳Python簡單易學,我們拋開某些可能的商業目的或者社會心理的原因之外(商業目的還用說嗎,比如最簡單的例子,xx學院專門做Python培訓的,當然我會不顧一切地說服你,Python是最好的程式語言,沒有之一,Java都是垃圾,都是落伍了的,這種睜眼說瞎話的還少嗎?因為你很懶,懶得去求證真相而已。社會心理就是我自己是搞Python的,我怎麼能說自己做的技術很Low逼呢,我自己是搞Java的,Java必然是最牛的啊)。讓我們單純從事實出發,Python簡單的原因只是因為,我們使用Python時,我們可能跟個傻子一樣,在直接呼叫別人給我們寫好的程式碼介面而已,而Java的很多處理相對要原生一點,我們寫的程式碼要稍微多一點。但是隻要完成封裝,程式碼就很難說誰更簡單了。而這個封裝的過程,其實才是程式設計最重要的部分,如果這一部分我們都不願意親自參與,也不想知道箇中實現原理,你想想,你怎麼可能成長為一個優秀的程式設計師,還有天理嗎?讓那些勤奮的人,情何以堪。

這一點就像C語言,由於C語言更原生,更底層,幾乎沒有提供太多封裝好的程式碼介面,很多問題的解決都需要我們自己寫程式碼,所以這也是為什麼很多人覺得C語言很難,道理是一樣的。但是,牛逼的人,都更喜歡自己創造。相比起C語言來說,Java和C#之類的,為我們提供的程式碼介面要豐富得多,我們使用起來其實也要容易得多,結論就是,在C語言面前,其它高階語言都太簡單了,因為封裝了太多可以直接用的類庫和介面。所以,要成長為一個高階程式設計師,一定不是寫寫簡單的應用而已,比如Java的原始碼是必須要去學習的,我們一定要知道這些封裝好的程式碼介面的實現細節。否則,跟使用Python封裝好的東西,又有何本質區別呢?

所以,請不要再糾結了。以我的經驗,如果你把任何一門程式語言作為你的人生的第一門用心學習的語言,那麼你只需要花極短的時間,就可以基本學會C++,JavaScript,PHP, Python,R,C#,Objective-C,Swift,Go(是的,每一門語言都可以在極短的時間學會,只是具體的問題解決和一些坑需要多積累一些實戰經驗而已)。

所以,你未來如果要立志成為一個專業的程式設計師,建議先學習Java(或者C#也行,兩者有很多原理上很像,實在不行,C/C++也可以哦),那是給程式設計師的專屬語言,是有門檻的,所以你才能夠建立自己的競爭力。如果你只是想玩玩,感受一下,或者是把程式語言作為一個工作中的工具而已,Python是個不錯的選擇。這是面向學習的建議,如果是在企業中真實做專案,那就不要糾結了,專案需要什麼,我們們就學什麼,不需要那麼多理由,幹,才是真理。

錘子好用還是榔頭好用?

Java好還是Python好?

為什麼非得二選一?

浮躁,一個吃飯的工具而已,搞技術的,通吃它們不就完了嗎,你再也不會糾結了,這,才是一個技術人員該有的狀態。難道不是嗎?

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

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

1.字串的連線和合並

連線和合並

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

java和Python的這場紛爭,誰才是最終的人生贏家

  • 合併//用join方法

java和Python的這場紛爭,誰才是最終的人生贏家

2.字串的切片和相乘

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

line='*'*30

print(line)

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

  • 切片

java和Python的這場紛爭,誰才是最終的人生贏家

3.字串的分割

  • 普通的分割,用split

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

phone='400-800-800-1234'

print(phone.split('-'))

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

  • 複雜的分割

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

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

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

filename='trace.h'

print(filename.endswith('h'))

>>True

print(filename.startswith('trace'))

>>True

5.字串的查詢和匹配

  • 一般查詢

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

java和Python的這場紛爭,誰才是最終的人生贏家

  • 複雜的匹配

java和Python的這場紛爭,誰才是最終的人生贏家

6.字串的替換

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


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

java和Python的這場紛爭,誰才是最終的人生贏家

7.字串中去掉一些字元

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

    line=' Congratulations, you guessed it. '

    print(line.strip())

    >>Congratulations, you guessed it.

注意:字串內部的空格不能去掉 ,若要去掉需要用re模組

  • 複雜的文字清理,可以利用str.translate,

    先構建一個轉換表,table是一個翻譯表,表示把't''o'轉成大寫的'T' 'O',

    然後在old_str裡面去掉'12345',然後剩下的字串再經過table翻譯


java和Python的這場紛爭,誰才是最終的人生贏家

最後說下,希望對大家有幫助


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31561003/viewspace-2222407/,如需轉載,請註明出處,否則將追究法律責任。

相關文章