python3 和 python2的區別
- 2020 年 1 月 8 日
- 筆記
1) 核心類差異
python2
python3
1. Python3對Unicode字元的原生支援。
Python2中使用 ASCII 碼作為默認編碼方式導致string有兩種類型str 和unicode,Python3隻
支援unicode的string。Python2和Python3位元組和字元對應關係為:

2. Python3採用的是絕對路徑的方式進行import。
Python2中相對路徑的import會導致標準庫導入變得困難(想像一下,同一目錄下有file.py,如 何同時導入這個文件和標準庫file)。Python3中這一點將被修改,如果還需要導入同一目錄的文件必 須使用絕對路徑,否則只能使用相關導入的方式來進行導入。
3. Python2中存在老式類和新式類的區別
Python3統一採用新式類。新式類聲明要求繼承object,必須用新式類應用多重繼承。
4. Python3使用更加嚴格的縮進。
Python2的縮進機制中,1個tab 和8個space 是等價的,所以在縮進中可以同時允許tab和space 在程式碼中共存。這種等價機制會導致部分IDE使用存在問題。
Python3中1個tab只能找另外一個tab替代,因此tab 和space共存會導致報錯:TabError: inconsistent use of tabs and spaces in indentation.
2) 廢棄類差異
1. print語句被Python3廢棄,統一使用print函數
2. exec語句被python3廢棄,統一使用exec函數
3. execfile語句被Python3廢棄,推薦使用exec(open("./filename").read())
4. 不相等操作符"<>"被Python3廢棄,統一使用"!="
5. long整數類型被Python3廢棄,統一使用int
6. xrange函數被Python3廢棄,統一使用range,Python3中range的機制也進行修改並提高 了大數據集生成效率
7. Python3中這些方法再不再返回list對象:dictionary關聯的keys()、values()、 items(),zip(), map(),filter(),但是可以通過list強行轉換:
1. mydict={"a":1,"b":2,"c":3}
2. mydict.keys() #<built-in method keys of dict object at 0x000000000040B4C8>
3. list(mydict.keys()) #['a', 'c', 'b']
8. 迭代器iterator的next()函數被Python3廢棄,統一使用next(iterator)
9. raw_input函數被Python3廢棄,統一使用input函數
10. 字典變數的has_key函數被Python廢棄,統一使用in關鍵詞
11. file函數被Python3廢棄,統一使用open來處理文件,可以通過io.IOBase檢查文件類型
12. apply函數被Python3廢棄
13. 異常StandardError 被Python3廢棄,統一使用Exception
3) 修改類差異
1. 浮點數除法操作符「/」和「//」的區別
「 / 」: Python2:若為兩個整形數進行運算,結果為整形,但若兩個數中有一個為浮點數,則結果為 浮點數; Python3:為真除法,運算結果不再根據參加運算的數的類型。 「//」: Python2:返回小於除法運算結果的最大整數;從類型上講,與"/"運算符返回類型邏輯一致。 Python3:和Python2運算結果一樣。
2. 異常拋出和捕捉機制區別
Python2 1. raise IOError, "file error" #拋出異常 2. except NameError, err: #捕捉異常 Python3 1. raise IOError("file error") #拋出異常 2. except NameError as err: #捕捉異常
3. for循環中變數值區別
Python2,for循環會修改外部相同名稱變數的值 1. i = 1 2. print ('comprehension: ', [i for i in range(5)]) 3. print ('after: i =', i ) #i=4 Python3,for循環不會修改外部相同名稱變數的值 1. i = 1 2. print ('comprehension: ', [i for i in range(5)]) 3. print ('after: i =', i ) #i=1
4. round函數返回值區別
Python2,round函數返回float類型值 1. isinstance(round(15.5),int) #True Python3,round函數返回int類型值 1. isinstance(round(15.5),float) #True
5. 比較操作符區別
Python2中任意兩個對象都可以比較 1. 11 < 'test' #True Python3中只有同一數據類型的對象可以比較
1. 11 < 'test' # TypeError: unorderable types: int() < str()
4) 第三方工具包差異
我們在pip官方下載源pypi搜索Python2.7和Python3.5的第三方工具包數可以發現, Python2.7 版本對應的第三方工具類目數量是28523,Python3.5版本的數量是12457,這兩個版本在第三方工具 包支援數量差距相當大。 我們從數據分析的應用角度列舉了常見實用的第三方工具包(如下表),並分析這些工具包在 Python2.7和Python3.5的支援情況: 分類 工具名 用途 數據收集 scrapy 網頁採集,爬蟲 數據收集 scrapy-redis 分散式爬蟲 數據收集 selenium web 測試,模擬瀏覽器 數據處理 beautifulsoup 網頁解釋庫,提供lxml的支援 數據處理 lxml xml 解釋庫 數據處理 xlrd excel 文件讀取 數據處理 xlwt excel 文件寫入 數據處理 xlutils excel 文件簡單格式修改 數據處理 pywin32 excel 文件的讀取寫入及複雜格式訂製 數據處理 Python-docx Word文件的讀取寫入 數據分析 numpy 基於矩陣的數學計算庫
數據分析 pandas 基於表格的統計分析庫
數據分析 scipy 科學計算庫,支援高階抽象和複雜模型
數據分析 statsmodels 統計建模和計量經濟學工具包 數據分析 scikit-learn 機器學習工具庫 數據分析 gensim 自然語言處理工具庫 數據分析 jieba 中文分詞工具庫 數據存儲 MySQL-python mysql的讀寫介面庫 數據存儲 mysqlclient mysql的讀寫介面庫 數據存儲 SQLAlchemy 資料庫的ORM 封裝 數據存儲 pymssql sql server讀寫介面庫 數據存儲 redis redis的讀寫介面 數據存儲 PyMongo mongodb的讀寫介面 數據呈現 matplotlib 流行的數據可視化庫 數據呈現 seaborn 美觀的數據可是湖庫,基於matplotlib 工具輔助 jupyter 基於web的python IDE,常用於數據分析 工具輔助 chardet 字元檢查工具 工具輔助 ConfigParser 配置文件讀寫支援
工具輔助 requests HTTP 庫,用於網路訪問
5) 工具安裝問題
windows環境 Python2 無法安裝mysqlclient。Python3 無法安裝MySQL-python、 flup、functools32、 Gooey、Pywin32、 webencodings。 matplotlib在python3環境中安裝報錯:The following required packages can not be built:freetype, png。需要手動下載安裝源碼包安裝解決。 scipy在Python3環境中安裝報錯,numpy.distutils.system_info.NotFoundError,需要自己手 工下載對應的安裝包,依賴numpy,pandas必須嚴格根據python版本、作業系統、64位與否。運行 matplotlib後發現基礎包numpy+mkl安裝失敗,需要自己下載,中國暫無下載源 centos環境下 Python2無法安裝mysql-python和mysqlclient包,報錯: EnvironmentError:mysql_confignot found,解決方案是安裝mysql-devel包解決。使用matplotlib報錯:no module named _tkinter, 安裝Tkinter、tk-devel、tc-devel解決。 pywin32也無法在centos環境下安裝。
python3