從python2.7和python3.0的語法差異總結

chenfeng發表於2019-05-14

一、基本語法

1、python3預設編碼


Python2 的預設編碼是 asscii,這也是導致 Python2 中經常遇到編碼問題的原因之一,至於是為什麼會使用 asscii 作為預設編碼,原因在於 Python這門語言誕生的時候還沒出現 Unicode。Python 3 預設採用了 UTF-8 作為預設編碼,因此你不再需要在檔案頂部寫 # coding=utf-8 了。


2、迭代器


在 Python2 中很多返回列表物件的內建函式和方法在 Python 3 都改成了返回類似於迭代器的物件,因為迭代器的惰性載入特性使得操作大資料更有效率。Python2 中的 range 和 xrange 函式合併成了 range,如果同時相容2和3,可以這樣:


另外,字典物件的 dict.keys()、dict.values() 方法都不再返回列表,而是以一個類似迭代器的 "view" 物件返回。高階函式 map、filter、zip 返回的也都不是列表物件了。Python2的迭代器必須實現 next 方法,而 Python3 改成了 next


3、print不再是語句,而是函式


比如原來是 print 'abc' 現在是 print('abc')


但是 python2.6+ 可以使用 from future import print_function 來實現相同功能。


4、原來1/2(兩個整數相除)結果是0,現在是0.5了


$ /opt/python3.6/bin/python3


Python 3.6.2 (default, Aug 4 2017, 10:27:08)


[GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin


Type "help", "copyright", "credits" or "license" for more information.


>>> 1/2


0.5


>>> 1/3


0.3333333333333333


5、新的字串格式化方法format取代%


6、python3 徹底廢棄了 long+int


統一為 int , 支援高精度整數運算


7、Python2中用raw_input ,Python3中用input


二、資料型別

1、字串


字串是最大的變化之一,這個變化使得編碼問題降到了最低可能。在 Python2 中,字串有兩個型別,一個是 unicode,一個是 str,前者表示文字字串,後者表示位元組序列,不過兩者並沒有明顯的界限,開發者也感覺很混亂,不明白編碼錯誤的原因,不過在 Python3 中兩者做了嚴格區分,分別用 str 表示字串,byte 表示位元組序列,任何需要寫入文字或者網路傳輸的資料都只接收位元組序列,這就從源頭上阻止了編碼錯誤的問題。


三、模組化程式設計

1、增加了一些新模組


concurrent.futures、venv、unittest.mock、asyncio、selectors、typing


2、去掉了一些模組或者函式


gopherlib、md5、contextlib.nested、inspect.getmoduleinfo等。


去掉的內容的原因主要是2點:


(1). 過時的技術產物,已經沒什麼人在用了;


(2). 出現了新的替代產物後者被證明存在意義不大。理論上對於開發者影響很小。


3、模組名稱修改


把一些相關的模組合併到同一個包裡面,如:


如httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib放進了http裡面。


urllib, urllib2, urlparse, robotparse放進了urllib裡面。


SocketServer模組名改成了socketserver,Queue模組名改成queue


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-2644248/,如需轉載,請註明出處,否則將追究法律責任。

相關文章