之前做Spark大數(shù)據(jù)分析的時候,考慮要做Python的版本升級,對于Python2和Python3的差異做了一個調(diào)研,主要對于語法和第三方工具包支持程度進(jìn)行了比較。
基本語法差異
核心類差異
- Python3對Unicode字符的原生支持
Python2中使用 ASCII 碼作為默認(rèn)編碼方式導(dǎo)致string有兩種類型str和unicode,Python3只支持unicode的string。python2和python3字節(jié)和字符對應(yīng)關(guān)系為:
- 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)入。
Python2中存在老式類和新式類的區(qū)別,Python3統(tǒng)一采用新式類。新式類聲明要求繼承object,必須用新式類應(yīng)用多重繼承。
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.
廢棄類差異
print語句被python3廢棄,統(tǒng)一使用print函數(shù)
exec語句被python3廢棄,統(tǒng)一使用exec函數(shù)
execfile語句被Python3廢棄,推薦使用exec(open("./filename").read())
不相等操作符"<>"被Python3廢棄,統(tǒng)一使用"!="
long整數(shù)類型被Python3廢棄,統(tǒng)一使用int
xrange函數(shù)被Python3廢棄,統(tǒng)一使用range,Python3中range的機(jī)制也進(jìn)行修改并提高了大數(shù)據(jù)集生成效率
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']
迭代器iterator的next()函數(shù)被Python3廢棄,統(tǒng)一使用next(iterator)
raw_input函數(shù)被Python3廢棄,統(tǒng)一使用input函數(shù)
字典變量的has_key函數(shù)被Python廢棄,統(tǒng)一使用in關(guān)鍵詞
file函數(shù)被Python3廢棄,統(tǒng)一使用open來處理文件,可以通過io.IOBase檢查文件類型
apply函數(shù)被Python3廢棄
異常StandardError 被Python3廢棄,統(tǒng)一使用Exception
修改類差異
- 浮點(diǎn)數(shù)除法操作符/和//區(qū)別
- Python2:/是整數(shù)除法,//是小數(shù)除法
- Python3:/是小數(shù)除法,//是整數(shù)除法。
- 異常拋出和捕捉機(jī)制區(qū)別
-
Python2
raise IOError, "file error" #拋出異常 except NameError, err: #捕捉異常
-
Python3
raise IOError("file error") #拋出異常 except NameError as err: #捕捉異常
- 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
- round函數(shù)返回值區(qū)別
-
Python2,round函數(shù)返回float類型值
isinstance(round(15.5),int) #True
-
Python3,round函數(shù)返回int類型值
isinstance(round(15.5),float) #True
- 比較操作符區(qū)別
-
Python2中任意兩個對象都可以比較
11 < 'test' #True
-
Python3中只有同一數(shù)據(jù)類型的對象可以比較
11 < 'test' # TypeError: unorderable types: int() < str()
新增類差異
所有在Python3.X中增加的新特性在Python2中都不支持,這些新特性的說明在官網(wǎng)中有詳細(xì)的說明:
- 3.1 https://docs.python.org/3.1/whatsnew/
- 3.2 https://docs.python.org/3.2/whatsnew/3.2.html
- 3.3 https://docs.python.org/3.3/whatsnew/3.0.html
- 3.4 https://docs.python.org/3.4/whatsnew/3.4.html
- 3.5 https://docs.python.org/3.5/whatsnew/3.5.html
- 3.6 https://docs.python.org/3.6/whatsnew/3.6.html
國內(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)行。