python3 和 python2的區別

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