-
1 # 叻道
-
2 # 你看我獨角獸嗎
什麼是Python 2?
Python 2使程式碼開發過程比早期版本更容易。它實現了Python增強建議(PEP)的技術細節。Python 2.7(2.x中的最新版本)已不再開發,並將於2020年停產。
什麼是Python 3?在2008年12月,Python釋出了3.0版。該版本的釋出主要是為了解決Python 2中存在的問題。這些更改的性質是,Python 3與Python 2不相容。它向後不相容 Python 3的某些功能已被反向移植到Python 2.x版本中,以實現在Python 3中輕鬆進行遷移過程。
因此,對於使用Python 2.x版本的任何組織,將其專案遷移到3.x都需要進行大量更改。這些更改不僅涉及專案和應用程式,還涉及構成Python生態系統一部分的所有庫。
使用哪個Python版本?就當今的Python版本2與版本3而言,Python 3絕對是贏家。這是因為Python 2將在2020年之後不可用。大規模採用Python 3是未來的明確方向。
考慮到對Python 2程式語言的支援下降以及從Python 3升級中獲得更多好處之後,始終建議新開發人員選擇Python版本3。但是,如果一項工作需要Python 2功能,那將是唯一令人信服的理由使用這個版本。
關鍵區別Python 3語法更簡單易懂,而Python 2語法則相對難以理解。Python 3的預設字串儲存為Unicode,而Python 2的儲存則需要使用“ u”定義Unicode字串值。Python 3變數的值永不變,而在Python 2中,在for迴圈中使用全域性變數時,其全域性變數值將改變。Python 3異常應放在括號中,而Python 2異常應放在符號中。簡化了Python 3的順序比較規則,而簡化了Python 2的順序比較規則。Python 3提供了Range()函式來執行迭代,而在Python 2中,xrange()用於迭代。 -
3 # 波波聊科技
語法
print不再是語句,而是函式,比如原來是 print "abc" 現在是 print("abc")但是 python2.6+ 可以使用 from future import print_function 來實現相同功能在Python 3中,沒有舊式類,只有新式類,也就是說不用再像這樣 class Foobar(object): pass 顯式地子類化object原來1/2(兩個整數相除)結果是0,現在是0.5了#python 2 >>> 1/2 0
#python3 >>> 1/2 0.5
異常的寫法改變:原來的except Exception, e 變成 except (Exception) as e編碼
Python2 的預設編碼是 asscii,這也是導致 Python2 中經常遇到編碼問題的原因之一,至於是為什麼會使用 asscii 作為預設編碼,原因在於 Python這門語言誕生的時候還沒出現 Unicode。Python 3 預設採用了 UTF-8 作為預設編碼,因此你不再需要在檔案頂部寫 # coding=utf-8 了。
# python2 >>> print sys.getdefaultencoding() ascii # python3 >>> print(sys.getdefaultencoding()) utf-8
字串
字串是最大的變化之一,這個變化使得編碼問題降到了最低可能。在 Python2 中,字串有兩個型別,一個是 unicode,一個是 str,前者表示文字字串,後者表示位元組序列,不過兩者並沒有明顯的界限,開發者也感覺很混亂,不明白編碼錯誤的原因,不過在 Python3 中兩者做了嚴格區分,分別用 str 表示字串,byte 表示位元組序列,任何需要寫入文字或者網路傳輸的資料都只接收位元組序列,這就從源頭上阻止了編碼錯誤的問題。
>>> s = "中文" >>> s "中文" >>> type(s) <class "str"> # 上面的str型別物件實際上相當於py2的unicode s.encode("utf-8") b"\xe4\xb8\xad\xe6\x96\x87" # str物件encode utf-8後,變成bytes物件,所以bytes物件取代了py2的str物件
所以:
py2 -> unicode -> 被 py3的str物件代替py2 -> str -> 被py3的bytes物件代替py2 與 py3 字串差異比較
迭代器
在 Python2 中很多返回列表物件的內建函式和方法在 Python 3 都改成了返回類似於迭代器的物件,因為迭代器的惰性載入特性使得操作大資料更有效率。Python2 中的 range 和 xrange 函式合併成了 range,如果同時相容2和3,可以這樣:
try: range = xrange except: pass
另外,字典物件的 dict.keys()、dict.values() 方法都不再返回列表,而是以一個類似迭代器的 "view" 物件返回。高階函式 map、filter、zip 返回的也都不是列表物件了。Python2的迭代器必須實現 next 方法,而 Python3 改成了 next。
map方法返回了迭代器而不再是列表
# py2 #直接返回列表 >>> map(lambda x: x*x, range(1, 3)) [1, 4] #py3 # 返回迭代器 >>> map(lambda x: x*x, range(1, 3)) <map object at 0x7f45371e5c18> #需要遍歷才能讀取,這樣對於大資料會更高效率 >>> map_data = map(lambda x: x*x, range(1, 3)) >>> for m in map_data: ... print(m) ... 1 4
asyncio 非同步IO模型
asyncio是Python 3.4版本引入的標準庫,直接內建了對非同步IO的支援。
asyncio的程式設計模型就是一個訊息迴圈。我們從asyncio模組中直接獲取一個EventLoop的引用,然後把需要執行的協程扔到EventLoop中執行,就實現了非同步IO。
回覆列表
實話說,這種純資訊類問題你在網上搜索比在這裡問更容易得到好的答案。
或者你去看python3的官方頁面,那應該也會介紹Python3的新特性,否則怎麼吸引使用者更新。