Python2和Python3的差異分析

之前做Spark大數(shù)據(jù)分析的時候,考慮要做Python的版本升級,對于Python2和Python3的差異做了一個調(diào)研,主要對于語法和第三方工具包支持程度進(jìn)行了比較。

基本語法差異

核心類差異

  1. Python3對Unicode字符的原生支持

Python2中使用 ASCII 碼作為默認(rèn)編碼方式導(dǎo)致string有兩種類型str和unicode,Python3只支持unicode的string。python2和python3字節(jié)和字符對應(yīng)關(guān)系為:

img
  1. Python3采用的是絕對路徑的方式進(jìn)行import。

Python2中相對路徑的import會導(dǎo)致標(biāo)準(zhǔn)庫導(dǎo)入變得困難(想象一下,同一目錄下有file.py,如何同時導(dǎo)入這個文件和標(biāo)準(zhǔn)庫file)。Python3中這一點(diǎn)將被修改,如果還需要導(dǎo)入同一目錄的文件必須使用絕對路徑,否則只能使用相關(guān)導(dǎo)入的方式來進(jìn)行導(dǎo)入。

  1. Python2中存在老式類和新式類的區(qū)別,Python3統(tǒng)一采用新式類。新式類聲明要求繼承object,必須用新式類應(yīng)用多重繼承。

  2. Python3使用更加嚴(yán)格的縮進(jìn)。Python2的縮進(jìn)機(jī)制中,1個tab和8個space是等價的,所以在縮進(jìn)中可以同時允許tab和space在代碼中共存。這種等價機(jī)制會導(dǎo)致部分IDE使用存在問題。Python3中1個tab只能找另外一個tab替代,因此tab和space共存會導(dǎo)致報錯:TabError: inconsistent use of tabs and spaces in indentation.

廢棄類差異

  1. print語句被python3廢棄,統(tǒng)一使用print函數(shù)

  2. exec語句被python3廢棄,統(tǒng)一使用exec函數(shù)

  3. execfile語句被Python3廢棄,推薦使用exec(open("./filename").read())

  4. 不相等操作符"<>"被Python3廢棄,統(tǒng)一使用"!="

  5. long整數(shù)類型被Python3廢棄,統(tǒng)一使用int

  6. xrange函數(shù)被Python3廢棄,統(tǒng)一使用range,Python3中range的機(jī)制也進(jìn)行修改并提高了大數(shù)據(jù)集生成效率

  7. Python3中這些方法再不再返回list對象:dictionary關(guān)聯(lián)的keys()、values()、items(),zip(),map(),filter(),但是可以通過list強(qiáng)行轉(zhuǎn)換:

mydict={"a":1,"b":2,"c":3}
mydict.keys()  #<built-in method keys of dict object at 0x000000000040B4C8>
list(mydict.keys()) #['a', 'c', 'b']
  1. 迭代器iterator的next()函數(shù)被Python3廢棄,統(tǒng)一使用next(iterator)

  2. raw_input函數(shù)被Python3廢棄,統(tǒng)一使用input函數(shù)

  3. 字典變量的has_key函數(shù)被Python廢棄,統(tǒng)一使用in關(guān)鍵詞

  4. file函數(shù)被Python3廢棄,統(tǒng)一使用open來處理文件,可以通過io.IOBase檢查文件類型

  5. apply函數(shù)被Python3廢棄

  6. 異常StandardError 被Python3廢棄,統(tǒng)一使用Exception

修改類差異

  1. 浮點(diǎn)數(shù)除法操作符/和//區(qū)別
  • Python2:/是整數(shù)除法,//是小數(shù)除法
  • Python3:/是小數(shù)除法,//是整數(shù)除法。
  1. 異常拋出和捕捉機(jī)制區(qū)別
  • Python2

    raise IOError, "file error" #拋出異常
    except NameError, err:  #捕捉異常
    
  • Python3

    raise IOError("file error") #拋出異常
    except NameError as err: #捕捉異常
    
  1. for循環(huán)中變量值區(qū)別
  • Python2,for循環(huán)會修改外部相同名稱變量的值

    i = 1
    print ('comprehension: ', [i for i in range(5)])
    print ('after: i =', i  ) #i=4
    
  • Python3,for循環(huán)不會修改外部相同名稱變量的值

    i = 1
    print ('comprehension: ', [i for i in range(5)])
    print ('after: i =', i  ) #i=1
    
  1. round函數(shù)返回值區(qū)別
  • Python2,round函數(shù)返回float類型值

    isinstance(round(15.5),int) #True
    
  • Python3,round函數(shù)返回int類型值

    isinstance(round(15.5),float) #True
    
  1. 比較操作符區(qū)別
  • Python2中任意兩個對象都可以比較

    11 < 'test' #True
    
  • Python3中只有同一數(shù)據(jù)類型的對象可以比較

    11 < 'test' # TypeError: unorderable types: int() < str()
    

新增類差異

所有在Python3.X中增加的新特性在Python2中都不支持,這些新特性的說明在官網(wǎng)中有詳細(xì)的說明:

國內(nèi)有對這些特性中的重要點(diǎn)進(jìn)行介紹的博文,可以作為參考:http://www.cnblogs.com/animalize/p/5633215.html

第三方工具包

我們在pip官方下載源pypi搜索Python2.7和Python3.5的第三方工具包數(shù)可以發(fā)現(xiàn),Python2.7版本對應(yīng)的第三方工具類目數(shù)量是28523,Python3.5版本的數(shù)量是12457,這兩個版本在第三方工具包支持?jǐn)?shù)量差距相當(dāng)大。

https://pypi.python.org/pypi?:action=browse&c=532

https://pypi.python.org/pypi?:action=browse&c=607

我們從數(shù)據(jù)分析的應(yīng)用角度列舉了常見實用的第三方工具包(如下表),并分析這些工具包在Python2.7和Python3.5的支持情況:

分類 工具名 用途
數(shù)據(jù)收集 scrapy 網(wǎng)頁采集,爬蟲
數(shù)據(jù)收集 scrapy-redis 分布式爬蟲
數(shù)據(jù)收集 selenium web測試,仿真瀏覽器
數(shù)據(jù)處理 beautifulsoup 網(wǎng)頁解釋庫,提供lxml的支持
數(shù)據(jù)處理 lxml xml解釋庫
數(shù)據(jù)處理 xlrd excel文件讀取
數(shù)據(jù)處理 xlwt excel文件寫入
數(shù)據(jù)處理 xlutils excel文件簡單格式修改
數(shù)據(jù)處理 pywin32 excel文件的讀取寫入及復(fù)雜格式定制
數(shù)據(jù)處理 Python-docx Word文件的讀取寫入
數(shù)據(jù)分析 numpy 基于矩陣的數(shù)學(xué)計算庫
數(shù)據(jù)分析 pandas 基于表格的統(tǒng)計分析庫
數(shù)據(jù)分析 scipy 科學(xué)計算庫,支持高階抽象和復(fù)雜模型
數(shù)據(jù)分析 statsmodels 統(tǒng)計建模和計量經(jīng)濟(jì)學(xué)工具包
數(shù)據(jù)分析 scikit-learn 機(jī)器學(xué)習(xí)工具庫
數(shù)據(jù)分析 gensim 自然語言處理工具庫
數(shù)據(jù)分析 jieba 中文分詞工具庫
數(shù)據(jù)存儲 MySQL-python mysql的讀寫接口庫
數(shù)據(jù)存儲 mysqlclient mysql的讀寫接口庫
數(shù)據(jù)存儲 SQLAlchemy 數(shù)據(jù)庫的ORM封裝
數(shù)據(jù)存儲 pymssql sql server讀寫接口庫
數(shù)據(jù)存儲 redis redis的讀寫接口
數(shù)據(jù)存儲 PyMongo mongodb的讀寫接口
數(shù)據(jù)呈現(xiàn) matplotlib 流行的數(shù)據(jù)可視化庫
數(shù)據(jù)呈現(xiàn) seaborn 美觀的數(shù)據(jù)可是湖庫,基于matplotlib
工具輔助 jupyter 基于web的python IDE,常用于數(shù)據(jù)分析
工具輔助 chardet 字符檢查工具
工具輔助 ConfigParser 配置文件讀寫支持
工具輔助 requests HTTP庫,用于網(wǎng)絡(luò)訪問

工具安裝問題

  • windows環(huán)境

Python2 無法安裝mysqlclient。Python3 無法安裝MySQL-python、 flup、functools32、Gooey、Pywin32、 webencodings。

matplotlib在python3環(huán)境中安裝報錯:The following required packages can not be built:freetype, png。需要手動下載安裝源碼包安裝解決。

scrapy在python3環(huán)境中安裝報錯,需安裝VC++2015安裝包: http://landinghub.visualstudio.com/visual-cpp-build-tools

scipy在Python3環(huán)境中安裝報錯,numpy.distutils.system_info.NotFoundError,需要自己手工下載對應(yīng)的安裝包,依賴numpy,pandas必須嚴(yán)格根據(jù)python版本、操作系統(tǒng)、64位與否。

運(yùn)行matplotlib后發(fā)現(xiàn)基礎(chǔ)包numpy+mkl安裝失敗,需要自己下載,國內(nèi)暫無下載源

  • centos環(huán)境下

python2無法安裝mysql-python和mysqlclient包,報錯:EnvironmentError: mysql_config not found,解決方案是安裝mysql-devel包解決。使用matplotlib報錯:no module named _tkinter,安裝Tkinter、tk-devel、tc-devel解決。

pywin32也無法在centos環(huán)境下安裝。

工具測試結(jié)果

解決上述的安裝問題后,編寫了測試腳本(附錄)運(yùn)行上述工具包的簡單案例,測試結(jié)果均通過,表明上述第三方工具包安裝成功后在Windows和Centos環(huán)境下均可以成功運(yùn)行。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,797評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,179評論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,628評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,642評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,444評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,948評論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,040評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,185評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,717評論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,794評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,418評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,414評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,750評論 2 370

推薦閱讀更多精彩內(nèi)容