Python2.x與3.x版本區別
Python的3.0版本,常稱為Python 3000,或簡稱Py3k。相對於Python的早期版本,這是一個較大的升級。
為了不帶入過多的累贅,Python 3.0在設計的時候沒有考慮向下相容。
許多針對早期Python版本設計的程式都無法在Python 3.0上正常執行。
為了照顧現有程序,Python 2.6作為一個過渡版本,基本上使用了Python 2.x的語法和庫,同時考慮了向Python 3.0的遷移,允許使用部分Python 3.0的語法與函數。
新的Python程式建議使用Python 3.0版本的語法。
除非執行環境無法安裝Python 3.0或程式本身使用了不支援Python 3.0的第三方函式庫。目前不支援Python 3.0的第三方函式庫有Twisted, py2exe, PIL等。
大多數第三方函式庫都正在努力相容Python 3.0版本。即使無法立即使用Python 3.0,也建議編寫相容於Python 3.0版本的程序,然後使用Python 2.6, Python 2.7來執行。
主要變化
Python 3.0的變化主要在以下幾個方面:
print語句沒有了,取而代之的是print()函數。 Python 2.6與Python 2.7部分地支援這種形式的print語法。在Python 2.6與Python 2.7裡面,以下三種形式是等價的:
print "fish" print ("fish") #注意print后面有个空格 print("fish") #print()不能带有任何其它参数
然而,Python 2.6實際上已經支援新的print()語法:
from __future__ import print_function print("fish", "panda", sep=', ')
新的str類別表示一個Unicode字符串,相當於Python 2.x版本的unicode類別。而位元組序列則以類似b"abc"的語法表示,以bytes類別表示,相當於Python 2.x的str類別。
現在兩個類別不能再隱式地自動轉換,因此在Python 3.x裡面"fish"+b"panda"是錯誤。正確的寫法是"fish"+b"panda".decode("utf-8")。 Python 2.6可以自動地將位元組序列辨識為Unicode字串,方法是:
from __future__ import unicode_literals print(repr("fish"))
除法運算子"/"在Python 3.x內總是會傳回浮點數。而在Python 2.6內會判斷被除數與除數是否為整數。如果整數會回傳整數值,相當於整除;浮點數則傳回浮點數值。
為了讓Python 2.6統一回傳浮點數值,可以:
from __future__ import division print(3/2)
捕獲異常的語法由except exc, var改為except exc as var。使用語法except (exc1, exc2) as var可以同時捕捉多種類別的異常。 Python 2.6已經支援這兩種語法。
集合(set) 的新寫法:{1,2,3,4}。注意{}仍然表示空的字典(dict) 。
字典推導式(Dictionary comprehensions) {expr1: expr2 for k, v in d},這個語法等價於
result={} for k, v in d.items(): result[expr1]=expr2 return result
集合推導式(Set Comprehensions) {expr1 for x in stuff}。這個語法等價於:
result = set() for x in stuff: result.add(expr1) return result
八進位數必須寫成0o777,原來的形式0777不能用了;二進位必須寫成0b111。新增了一個bin()函數用於將一個整數轉換成二進位字符串。 Python 2.6已經支援這兩種語法。
dict.keys(), dict.values(), dict.items(), map(), filter(), range(), zip()不再傳回列表,而是迭代器。
如果兩個物件之間沒有定義明確的有意義的順序。使用<, >, <=, >=比較它們會投擲異常。例如1 < ""在Python 2.6裡面會回傳True,而在Python 3.0裡面會投擲異常。現在cmp(), instance.__cmp__()函數已經被刪除。
可以註解函數的參數與回傳值。此特性可方便IDE對原始碼進行更深入的分析。例如給參數增加類別訊息:
def sendMail(from_: str, to: str, title: str, body: str) -> bool: pass
合併int與long類型。
多個模組改名(根據PEP8):
舊的名字
新的名字
_winreg winParser
_winreg win s reg copyreg Queue queue SocketServer socketserver repr socketserver repr StringIO模組現在被合併到新的io模組內。 new, md5, gopherlib等模組被刪除。 Python 2.6已經支援新的io模組。 httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib被合併到http包內。 取消了exec語句,只剩下exec()函數。 Python 2.6已經支援exec()函數。
以上就是【python教學】Python2.x與3.x版本區別的內容,更多相關內容請關注PHP中文網(www.php.cn)!