應該學習最新版本的 Python 3 還是舊版本的 Python 2?
看到最新Python版本是3.5,但是網上的資料,包括出版的書籍,都是最晚到13年左右,很多細節都不同,語法也過時了。
那此時應該直接學習3.X還是2.X?如果前者的話,有什麼推薦的資料或者書么?最好中文。英文看起來效率會比較低。
python 3 有很大改進,比 2 更容易理解。
如果題主決定學 2,建議當被 string bytes 搞暈時,了解一下 3,再做決定。
另外,3 的庫已經比較全了,不支持 3 的,多數是不再維護的。看到現在,我一直很好奇為什麼會有人因為糾結學Py 3還是Py 2而浪費大量時間。
編程的話最重要的是編程思想,Python 3和Python 2雖然是兩門完全不同的語言(故意黑),但是它的思想基本是共通的,只有少量的語法差異。而編程中,語法只是細枝末節的東西。
那麼無論你學2還是3,都沒有區別。會Python的人,一般2和3都會。當你學會了3,你只要稍微花上一點時間學習Python 2的語法,那麼Python 2和Python 3這兩門語言你也就都學會了——而認識語法差距花的時間,一般也不會比你糾結學哪個花的時間更多。
不要糾結學什麼了,想到就去學,不要在這方面糾結太多時間,選Py 2或者Py 3並沒有什麼差異。——————————————————————————————————
最後給大家看一個從8月份開始,就在各大Q群進行調研,進行技術選型的人。
評論里看來,應該也有非常多的知友見過這個人了,我所在的不少群也都曾私下討論過這個人是個什麼心態。這裡塗去個人信息。
(九月份,上面那些框架是他從各大Q群聽別人推薦的,這個人不會編程,他要學的語言,是十年內不會落伍,不會沒飯吃的語言。一開始他聽人推薦,是打算用Laravel的,因為聽說很好用)
(十月上旬,還在糾結要學什麼。做Web我當然給他推薦PHP,他說聽別人說PHP性能不行。我就說那你學C++吧,騰訊和新浪不少網站就是C++寫的,他說聽人說C++太難,學不了。)
(十月下旬,同樣還在問要學哪些語言和技術,要實用還要簡單,可以讓他在三到六個月從零基礎成為全棧工程師,全棧工程師真是大白菜。)
(十一月中旬,技術選型還未完成,還不知道學什麼。但是前幾天不知道從哪裡聽來了Go Lang,這門語言也加入了他的選型列表。因為前沿,他開始傾向於Go Lang。)
昨天,他還拿著關於縮進的示例代碼,開始糾結PHP、Node.js、Python哪個好,這次開始傾向於Python,然而還是沒有進行編程的學習。
(不要吐槽Node.js版本中的語法錯誤,或者是代碼風格。)
——————————————————————————————————
我不希望題主成為上面這樣的人。
scrapy已經支持python3了 Python 3 is Coming to Scrapy
========== 20160512 分割線 ==========
用Python做爬蟲的注意一下,scrapy不支持Python3。 Frequently Asked Questions
這裡有篇文章講scrapy的遷移工作:Scrapy on the Road to Python 3 Support
主要原因是Twisted還不完全支持Python3. 雖然Twisted大部分是可移植到python3的,但Twisted的http agent並不支持Python3.
scrapy團隊兩年前就開始了向python3的移植工作。現在scrapy每次提交都有一部分測試在python3下執行。
除了Twisted, 移植的另一個大問題是Request和Response對象。這個問題最近得到了解決。解決中遇到了如下一些問題:
- HTTP headers應該是byte還是unicode?key和value需要區別對待么?一些headers如cokies通常是UTF-8, HTTP Basic Auth通常是latin1編碼。其他的headers卻沒有一個通用的編碼。通常用bytes表示HTTP headers是合理的。但有一個問題:如果你將現有代碼從Python2.x移植到3.x,一些以前運行正常的代碼可能會悄悄的出錯。比如一個HTTP response包含"content-type: application/json".如果headers用bytes表示,在Python2.x中,content_type == "application/json"返回True, 但在Python3.x中就會返回False,因為你在拿Unicode字面量和bytes進行比較。
- 如何正確的進行百分比轉義和反轉義?正確轉義依賴於網頁的編碼和該轉義URL的哪部分。如果網頁使用非ASCII編碼就可能有問題。經過一些實驗後我們發現瀏覽器在干一些很瘋狂的事情:URL路徑在轉義之前進行了UTF-8編碼,但query string在轉義前卻使用了網頁里的編碼。你不能依賴瀏覽器在界面上顯示了什麼來判斷URL的編碼,在OS X和Linux上,每個FireFox和Chromed發送給伺服器的都是UTF-8編碼的路徑和網頁編碼的query string.但它們顯示給用戶的則依賴於瀏覽器和操作系統。
- URL相關的函數在Python2.x和3.x中有很大不同。Python2.x中這些函數只接受bytes,Python3.x中只接受Unicode. 這和瘋狂的編碼問題搞在一起讓代碼移植變得越發困難。
Py 3 毫不猶豫,強烈反對說什麼向後兼容什麼歷史原因,就是因為你們 Py 3 才被抹黑成這樣的。之前看到個幻燈片,說不用Py3的你們錯過了什麼,我找找。(前幾期碼農周刊看到的,沒時間找了,這個答案是我憑著一口怒氣用手機碼的。)
乾貨:
十個碉堡了的 Python 特性,你不能用是因為你拒絕升級 Python 3
(翻頁用方向鍵)
你真以為向後兼容就是兼容?Python(社區)在 2 到 3 的兼容已經做了大量大量大量的工作了。2to3 你們都知道,這個你們也該知道:Six: Python 2 and 3 Compatibility Library
現在 Py 2.7 向前兼容已經很好了,很多庫同一套代碼兼容 2.7 和 3,這叫不能兼容?哪個平行語言一套代碼直接能用到另一個語言上?這叫平行語言?
平心而論,有斷層,但是確是容易彌補的。
你們真以為那麼多年 Py3 的更新都是吃白飯的?一個現代時髦腳本語言離開了不斷的特性更新,只有半死不活的安全維護,這算活著!?
醒醒吧,社區正在不斷向 3 遷移,雖然手頭沒有數據,但是不信可以寫代碼去 GitHub 之類的地方統計一下,Py 3 的支持是什麼樣的趨勢。當年確實不方便用 3,因為沒什麼庫,我因為這樣的考慮入門也是用的 2 ,現在年復一年,一個又一個的庫遷移了,你們還是一套說辭,這不是慣性不是惰性是什麼?
現在還不支持 Py 3 的庫大多是常年無人維護的東西了,當然還有少數必須的,比如說 OpenCV,但這不是放棄 Py3 的理由,人家問的是初學者,對於初學者來說不需要考慮公司用什麼,不需要考慮計算某種化學數據的庫是不是用 Py2 寫的,人家到時候要用回 Py 2 稍微注意一點就行了——我現在實習中用 Py 2 也就是一直被編碼搞得很惱火,其他沒遇到什麼問題。
3.X版本的沒有pandas、matplotlib、scipy庫
請問你是哪個時代的Py3?難道你是坐時光機過來的??我用 Py3 處理數據機器學習處理圖片,歡得很。
你打算把你的生命浪費在處理編碼問題,體會那些早已過時的語法嗎?一想到 map filter 竟然生成一個 list 我就心寒。
2.7 已經永不添加新的特性了,只會修復原有安全問題。
PyPy,各大 Web 框架,科學計算包(SciPy.org — SciPy.org),都已完美支持。(PyPy 是最近成熟支持的,http://morepypy.blogspot.jp/2014/06/pypy3-231-fulcrum.html,這也說明了趨勢)
不要活在過去啊。
如果你們真信了向 Py 3 遷移要十年的話,Py 3 的遷移就需要無限年,你仔細嘗試一下,那麼向 Py 3 遷移只需要五分鐘。
更新:
我不是說你不能用 2,純粹看工程需要甚至個人喜好,但我需要破除對 3 的偏見。你說我喜歡 2 要用 2,你說你的代碼依賴 2 要用 2,我舉雙手支持。但是你說新手別學 3,因為沒人用 3,3不好學沒有庫,我就不敢苟同了。你是你,我不能強求你任何事情,哪怕你用 Py1 我都管不著。
- 編碼問題,首先這個問題是對初學者來說的,如果你覺得初學者學習 Python 要懂得 Python 的 str 類型是 byte array ,每一個字只有一個位元組的空間,如果要放中文必須把一個中文用多個位元組編碼放進 str 用得時候組合起來,或者用另外一個類型……的話,那我無話可說。其次,就算你獨善其身,你也可能碰到庫翔一樣的 unicode 支持。
- 庫問題,這是我的答案一直在說的——有名的庫紛紛支持 Python 3,沒有歷史包袱的話使用 Python 3 基本不會碰到任何問題。
- 語法差異是不大,這就是兩者能做到兼容的基礎。那麼對於一個新手學習來說,應該去學雖然資源豐富但是終將死去的 2,還是去學 3?應該忍受 class Foobar(object): 還是輕鬆地寫 class Foobar: ?應該是 input_raw 還是直接 input?
- 對於上一條的補充,我說 Python 2 資料豐富,但實際上很多 Python 的資源是兩者共享的(大多數問題是庫問題。)其次,現在的 Py2 教程什麼的也太老了——當然你說你百度搜索某個問題出來個百度空間的知其然不知其所以然的解決方法是寶貴的遺產的話那我無話可說。
- 如果你們真的,真的,真的先入為主地把 2 和 3 已經當做兩個不同的語言了那還怎麼談?__future__ 真的哭暈在廁所啊。
更新 3 的局限,你們自己看,有這方面需要的人或許比較適合Python 2,歡迎補充指正:
- OpenCV
- OpenStack
- 一些雲平台,比如 GAE
- cz_freeze 不能將 Python 腳本打包成單獨的 exe 文件
- 待補充
樓主首先要搞明白一件事,python語言的最大優勢並不是語言本身的特性,而是它擁有腳本語言中最豐富的第三方包(模塊,庫或者叫什麼也好),這回其他任何語言都無法比擬的巨大優勢。
很多人學python並不是因為python適合開發什麼軟體或者工程,而是因為python擁有某個非常適合他們工作相關領域的簡單易用的工具包。
所以,學pyhton2還是3關鍵要考慮的是你所準備使用的模塊是否支持3.x.
以我為例,我使用python主要用於實驗也就是科學計算,我的主要研究方向是神經網路,常用的模塊包括numpy, scipy, theano, pylearn2,在這幾個模塊中前兩個貌似已經有3.x版,但是後兩個短期內幾百年沒有可能出現3.x版,而他們正好是GPU實驗必不可少的模塊。
在這種情況下,我當然要繼續堅持使用python2了。
總而言之,我的建議是,學python,首先要明確自己要做什麼任務,要使用哪些模塊,以自己需要的模塊為中心學習,而不是像學習c++和java那樣以語言本身或者設計模式為主要學習內容。這一點其實與matlab很相像,只學習matlab的語法可以說毫無意義,真正有用的是學習你所需要的matlab各個函數的用法。
從我個人的意願來說,選擇最新的技術是一個更好的選擇。然而事實上,新技術的普及需要時間、個人的使用需求也不盡相同,因此很難斷定應該做出何種選擇。
所以我想最好的方法是將兩個選擇帶來的不同影響盡量的表述清楚,再由題主或者其他有需要的人來自行選擇。
在正文開始前,給「太長不看」的同學們提個醒:如果沒有特彆強烈的需求,最好學習新技術。無論是Python2還是Python3,都是一個很好的選擇。
不少人都說內容過時了,那我就先刪掉,花個時間把新的內容整理一下。本來我想的是語法上的區別並沒有發生什麼改變,既然大家不喜歡那就改了。
計算機初學者問我該學什麼語言Top1問題編年史(大部分日期都是瞎編的):
1978年 至 1985年:我該學習機器理解的彙編語言還是自然語言的C語言?1985年 至 1995年:我該學習面向過程的C語言還是面向對象的C++?
1995年 至 2000年:我該學習不能跨平台的C++還是跨平台的Java?
2000年 至 2010年:我該學習開源的Java還是微軟的C#?
2010年 至 2014年:我該學習靜態類型的Java還是動態類型的Python?
2014年 至 2015年:我該學習經典的Python2還是最新的Python3?
……
……
(100年後)
2100年:我該學習跨語言跨人種意念編程的Shity語言還是支持量子編碼超並發的WTF語言?
我反正是對著2的教程用3來寫,,,於是不僅學會了2和3,還掌握不少2to3的經驗╮( ̄▽ ̄")╭
Python教程 - 廖雪峰的官方網站
他實戰部分我也是python3寫的↓↓↓caolinjian/awesome-python3-webapp · GitHub
如果讓我說,看情況。我在公司會維護兩種項目,一種產品級的,無論如何都要保證按時上線,這種情況下為了庫兼容性只能選2,另一種是實驗性質多過產品性質的,就毫不猶豫選3。別的不說不說光一個unicode問題就夠做出選擇了何況有些庫比如pyqt5隻有3版本的。
建議先學習 Python2.7, 隨後再了解 Python3.4與 Python2.7的差異部分.
至於該如何學習Python2.7,請翻看我其他回答.
原因:
1. 搞不懂學什麼,那就都學好了.糾結個屁.把糾結的時間充分利用,2個版本都學完了.
2. Python2.7 和 Python3.4 差別沒有那麼多.簡單了解一下.很容易切換.
3. 市面上,主流的學習書籍,是 Python2版本的(2.5, 2.7的最多)
4. 項目里,Python2.X的項目,遠遠多過 Python3.X
5. 市場份額為王.根據 PyPI 下載統計,Python 3 用戶只有不足 Python 2 用戶的 1%。因此,你遭遇的 Python 3 特定的問題將很難在網上搜索到。(潛台詞: 那些叫囂學 Python3的,請閉嘴.)
6. 做開發,不是搞研究.踩坑搞不定,又在網上找不到解決思路,加班加成狗的時候.請記得:裝逼不成反被 cao.
flask 項目官網文檔統計:
Python 3 Support
Few Users
Python 3 currently has less than 1% of the users of Python 2 going by PyPI download stats. As a result many of the problems you will encounter are probably hard to search for on the internet if they are Python 3 specific.
少數派根據 PyPI 下載統計,Python 3 用戶只有不足 Python 2 用戶的 1%。因此,你遭遇的 Python 3 特定的問題將很難在網上搜索到。
學python3吧,這麼說吧,python3和python2就是兩種不同的語言,python3設計的更符合應用。以後主流必然是python3,不要看現在的書上講的是什麼語言,現在微機原理那本書講的還是8086呢,你還用8086么?
為什麼要用PY3?
有個很簡單的理由,官方說PY2隻維護到2020年。
這不只有4年多了嗎?
應該學習Python3
很多初學者糾結學 Python2 還是 Python3,Python3 不是趨勢而是現實,儘管不少公司還在用 Python2,但只要主流第三方框架宣布不再支持 Python2,那麼 Python2 很快就會被淘汰。況且 Python2 和 Python3 的從使用角度來說區別只有不到 1%。花一個小時的時間就能區分兩者的差異。所以不要擔心學 Python3 找不到工作。
Python2的坑巨多,尤其是處理字元那塊,字元還分為 str和unicode兩種類型,encode、decode能把人搞殘,為什麼?因為python 91年發布了,unicode 92年才誕生,python 默認採用了 ascii 作為編碼格式,因此,編碼、解碼的時候就出現了各種 UnicodeXXXError。而 Python3 把默認編碼改成了utf-8,可以兼容中文了,編碼問題也少了很多。 而python3把字元串那塊徹底重寫了。只有bytes和str兩種類型。
python2 很多性能問題官方不再改進,而是在python3中改進,希望的就是讓你們儘快的切換到py3。比如:為什麼python3執行 x in range(100000000001) 如此快?
已經開始有第三方框架宣布不再支持py2.x,比如Django2.0就不再支持python2
作為沒有歷史包袱的初學者,自然應該選3.x。
Python2orPython3 說,除非:1.要用只有2.x才有的庫,2.你被要求非要用2.x。否則選該選3.x。
2再好再主流,未來的份額只會有降無升。語法上來說,3.x填了很多坑,用戶體驗優於2.x(換言之,用起來爽)。2.x每次from future import xxx難道不累么?future早就已經擺在你們面前了。
論lib支持度:https://python3wos.appspot.com/ 最常用的200個lib現在只有35個還是紅的了,而且還會逐漸降低。在連超級大坑Pypy都已經支持3.x的今天,py3k生態圈不成熟什麼的已經不成說辭了。
LPTHW說2.x還可以戰十年:zed這句話是2010年說的。現在10年也過了一半了。現在有大把人(比如我)只用3,一樣活得很開心。一個人學一個語言不學最高版本的話,目的一般都是為了「實用、趕快做事」。抱著這個心態一則動力很快耗竭(因為沒有真實的興趣),二則很容易滿足於入門級的思路
必須果斷學 3,並且,萬一有需要要寫 Py2 的東西,記得最開始寫上
from __future__ import division, print_function
學習Python 2還是Python 3?
羅振宇在今年的跨年演講,《時間的朋友》中有個觀點,大意是說,人們都有一種受虐情節,有時候希望別人對他粗暴一點。為此,他還舉了兩個例子,分別是「喬布斯對待消費者的態度」和「和菜頭不尊重他的飲食需求」,末了還很享受的來一句:我愛死他了,對我再粗暴一點好不好!
看到很多新同學在學習Python的過程中,猶豫學習Python 2還是學習Python 3而遲遲不行動,白白地浪費了大把時間,錯過了升職加薪的機會,我真心覺得非常遺憾。所以,我忍不住想對大家粗暴一次,給大家一個粗暴而又正確的答案:
應該學習Python 2還是Python 3?
都要學!
這個答案可能很出乎意料,也很容易反駁,例如:
- Python 3 才是Python的未來
- Python 官方都建議指直接學習Python 3
- Python 2 只維護到2020年
真的是這樣嗎?作為一個在一線互聯網公司奮鬥的工程師,也是一個多年的Python老手,大家不妨來看看我這麼說的理由。
為什麼還要學習Python 2
Python 2隻維護到2020年不應該成為你拒絕Python 2的理由
所有糾結學習Python 2還是Python 3的朋友都知道,按照Python官方的計劃,Python 2只支持到2020年。可能大家接觸Python的時間還不長,不知道Python官方曾經還說過,Python 2只支持到2015年(https://github.com/python/peps/blob/master/pep-0373.txt)。所以,大家可以看到,跳票不是中國人的特權,Python官方也是會跳票的。
如果大家關注科技新聞的話,會注意到,就在前幾天,微軟剛宣布將在2020年對Win 7停止任何技術支持,之後即使遇到BUG和安全問題,他們也不會再修復,就像現在的XP一樣。但是,大家看看我們周圍的同事、朋友、親戚,到底是用Win 7的多還是用Win 10的多?這些用Win 7的人有吵著說我要升級Windows的嗎?用Win 10的人有吵著讓用Win 7的人升級嗎?
但是,在Python這個圈子,就是有很多人吵著要讓別人升級Python 3。很多時候用戶並不關心自己用的是Python 2還是Python 3,只要能用就行。所以,用Python 2的人並沒有什麼動力去升級到Python 3。
如果你覺得,Python 3才是Python的未來,不希望接觸Python 2的項目。那麼,問題來了,女神跟你說,晚上來我家給我修下電腦唄,但是我的電腦是Windows XP的,你是去還是不去?
Python官方建議學習Python 3隻是一種一廂情願的行為
我們來看一下Python 2和Python 3的下載統計數據(Python 2.7 still reigns supreme in pip installs):
Python 2的使用量遠遠超過Python 3。而且,大家注意豎軸的單位,是指數!簡單換算一下就知道,僅從下載量來說,Python 2.7的下載量是總下載量的90%!所以,學習Python,想直接拋棄Python 2學習Python 3,幾乎是不可能的事情。
上面的數據是全球範圍的統計數據,我們來看看中國互聯網的情況。為了寫這篇文章,我專門在同學群裡面發了紅包,邀請了來自百度、阿里、騰訊、網易、美團、華為、招行、建行、eBay、美圖、Oracle等公司的一線技術專家,統計了各大公司使用Python的情況。
統計數據如下:
- 10% 使用 Python 3
- 20% 既使用Python 2也使用Python 3,Python 2用的更多
- 70% 使用Python 2
統計數據基本與pypi的全球範圍的統計數據吻合。所以,如果你說,我一開始學的就是Python 3,Python 3也是Python的未來,我不想去了解和學習Python 2。那麼,你可能要和大半個中國互聯網失之交臂了。或許你也不在乎,但是,如果有人拿錢砸你讓你維護Python 2的代碼呢?
Python 2還會存在很長一段時間
不知道大家有沒有想過,為什麼Python官方極力讓大家使用Python 3,而Python 2依然處於統治地位呢?
其實答案很簡單也很粗暴:因為絕大多數人,你給他什麼,他就用什麼。據我說知,儘管Python 3在2008年12月就已經發布了,但是,目前Python 3仍然不是任何操作系統的默認Python解釋器,這是Python 3使用不廣泛的主要原因。
我們都知道,在任何一家公司,升級伺服器的操作系統版本都是一個很慎重事情。所以,我們有理由相信,Python 2還會存在很長一段時間。很長是多長呢?至少比2020年還要長。
這個世界並不是非黑即白的,Python也不是
有了前面的數據做支撐,我們不是應該學習Python 2嗎,為什麼Python 2和Python 3都要學呢?
首先,這個世界並不是非黑即白的,Python也不是。在學習Python 2和學習Python 3中間,其實有一個很好的平衡,那就是同時兼容Python 2和Python 3。為了做到同時兼容Python 2和Python 3,需要深用到Python的__future__庫。__future__庫裡面包含了不少從Python 3 backport 到Python 2的特性,充分使用__future__庫,可以很好的兼容Python 2和Python 3。
其次,Python 2和Python 3確實有一些差異,但是,並沒有大家想像的那麼大,Python 2和Python 3之間的差異不到Python語法的10%,我們可以快速地了解哪些Python 2裡面的語法在Python 3中已經被棄用,在我們寫代碼的過程中,規避掉這一部分語法即可。在Python的最佳實踐中,Python 3里棄用的Python語法,在Python 2裡面也不推薦使用,不然也不會被棄用了。如果你知道並堅持Python的最佳實踐,那麼,對你來說,Python 2和Python 3的差異就更小了。
最後,我們可以參考優秀的開源軟體的做法,如OpenStack,努力做到代碼同時兼容Python 2和Python 3(Python3 - OpenStack),也可以藉助一些開軟的庫(如six)來同時兼容。如果能夠做到同時兼容Python 2和Python 3,我們的使用者將更廣泛,我們的代碼也將更有價值。
stop talking, just do it
前面說了我對學習Python 2還是Python 3的一些觀點,希望能夠幫助大家少走彎路,另外,關於Python的版本問題,我這裡還有一些良心建議:
- 學習Python前,先了解在Python 3裡面已經棄用的Python 2語法,對這些部分簡單帶過不要花太多時間
- 使用Python 2,不要使用Python 2.7以前的版本
- 使用Python 3,不要使用Python 3.4以前的版本
- 多了解Python 2的__future__庫
- 對同一份代碼,不要為Python 2和Python 3分別維護分支,努力在一套代碼中兼容Python 2和Python 3
這篇文章詳細的說明了為什麼要同時學習Python 2和Python 3,如何在Python 2和Python 3中找到一個平衡。但是,重要的不是糾結學習Python 3還是Python 2,而是「stop talking, just do it!」。
很多人在誤導初學者,以一個熟手的身份在教訓和凌辱初學者,打擊別人的氣勢和自尊,而且誤人子弟。
你的參考書(教科書、學習資料)如果是基於2.x的就用2.x,如果是基於3.x就用3.x,以免在學習過程中產生不必要的麻煩和困擾。其他的事情,可以以後再說。
推薦新人用只維護到2020年的py2,簡直就是一種謀殺,浪費別人的生命。
自己不願意更新項目,不願意跟進新技術,以:我們還在用py2的理由,阻止新人用新技術,這是在謀殺整個python社區。
試想一下:當整個業界都在發展新技術,新結構,新演算法的時候,你還在用py2,你能看到未來python整個將被業界淘汰么?
只有一種情況下,我會推薦別人用py2:他這個項目用py3做不出來的時候!
python不是都有six了么,為什麼還討論2和3啊
推薦閱讀:
※你為什麼從中國移動離職?
※《商業價值》移動互聯網創新大會 2013 的簡介究竟是什麼意思?
※我們看一眼廣告值多少錢?創造了多少價值?
※小米手機的媒體開放日都有哪些環節?
※高德導航今天宣布免費,為什麼高德會突然做出這樣的決定?