Python 3 代表 Python 語言進化的一個產物,所以它不會執行大多數針對 Python 2.x 版本 直譯器所寫的舊程式碼。但是,這並不意味著你不能識別舊有的程式碼,或者需要廣泛的移植才 能使舊程式碼工作於 3.x 版本下。事實上,新的語法與過去的語法非常相似。然而,因為 print 語句在新版本中不再存在,所以它很容易破壞舊有的程式碼。附錄將討論 print 和版本 3.x 的其 他變化,並且將著重強調為了使其更優秀,Python 必須進行的一些改進。最後,我們給出了 一些遷移工具,它們可能有助於你實現這一轉變。
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語句沒有了,取而代之的是print()函式。 Python 2.6與Python 2.7部分地支援這種形式的print語法。在Python 2.6與Python 2.7裡面,以下三種形式是等價的:
print "hello"print ("python") #注意print後面有個空格print("app") #print()不能帶有任何其它引數
然而,Python 2.6實際已經支援新的print()語法:
from __future__ import print_functionprint("hello", "python","app", sep=',')
Unicode目前 Python 使用者面對的又一個“陷阱”就是,字串現在預設為 Unicode 編碼。這種變 化不可能很快就來,當處理 Unicode 和通常的 ASCII 字串時,無數的 Python 開發人員遇到 這種問題已經不止一兩天了。這種問題看起來如下所示。
UnicodeEncodeError: 'ascii' codec can't encode characteru'xae' in position 0: ordinal not in range(128)
在 Python 3.x 中這種型別的問題將不再經常發生。關於 Python 中使用 Unicode 的更 多資訊,可以檢視 Unicode HOWTO 文件(請參閱 C.3 節的 Web 地址)。隨著新版本的 Python 採用了這種模型,使用者將不再需要使用 Unicode 和 ASCII/非 Unicode 字串這些 術語。“Python 3.0 中的新內容”(What’s New in Python 3.0)文件相當詳細地總結了這種 新模型。 Python 3 使用了文字(text)和(二進位制)資料的概念,而非 Unicode 字串和 8 位字元 串。所有的文字都是 Unicode 編碼的。然而,編碼的 Unicode 表示成二進位制資料。用來儲存 文字的型別是 str,而用來儲存資料的型別是 bytes。
python2
python3
是否可變
str("")
bytes(b"")
否
unicode(u"")
str("")
否
N/A
bytearray
是
由於 Python3.X 原始碼檔案預設使用utf-8編碼,這就使得以下程式碼是合法的:
>>> 中國 = 'china'>>>print(中國)china
Python 2.x
>>> str = "我愛北京天安門">>> str'xe6x88x91xe7x88xb1xe5x8cx97xe4xbaxacxe5xa4xa9xe5xaex89xe9x97xa8'>>> str = u"我愛北京天安門">>> stru'u6211u7231u5317u4eacu5929u5b89u95e8'
Python 3.x
>>> str = "我愛北京天安門">>> str'我愛北京天安門'
除法運算Python中的除法較其它語言顯得非常高階,有套很複雜的規則。Python中的除法有兩個運算子,/和//
首先來說/除法:
在python 2.x中/除法就跟我們熟悉的大多數語言,比如Java啊C啊差不多,整數相除的結果是一個整數,把小數部分完全忽略掉,浮點數除法會保留小數點的部分得到一個浮點數的結果。
在python 3.x中/除法不再這麼做了,對於整數之間的相除,結果也會是浮點數。
Python 2.x:
>>> 1 / 20>>> 1.0 / 2.00.5
Python 3.x:
>>> 1/20.5
而對於//除法,這種除法叫做floor除法,會對除法的結果自動進行一個floor操作,在python 2.x和python 3.x中是一致的。
python 2.x:
>>> -1 // 2-1
python 3.x:
>>> -1 // 2-1
注意的是並不是捨棄小數部分,而是執行 floor 操作,如果要擷取整數部分,那麼需要使用 math 模組的 trunc 函式
python 3.x:
>>> import math>>> math.trunc(1 / 2)0>>> math.trunc(-1 / 2)0
不等運算子Python 2.x中不等於有兩種寫法 != 和 <>
Python 3.x中去掉了<>, 只有!=一種寫法,還好,我從來沒有使用<>的習慣
輸入的不同從鍵盤錄入一個字串
原:
raw_input( "提示資訊" )
改為:
input( "提示資訊" )
在python2.x中raw_input()和input( ),兩個函式都存在,其中區別為:
– raw_input()---將所有輸入作為字串看待,返回字串型別
– input()-----只能接收"數字"的輸入,在對待純數字輸入時具有自己的特性,它返回所輸入的數字的型別(int, float )
在python3.x中rawinput()和input( )進行了整合,去除了rawinput(),僅保留了input()函式,其接收任意任性輸入,將所有輸入預設為字串處理,並返回字串型別。
httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib被合併到http包內。 取消了exec語句,只剩下exec()函式。
I/O方法XREADLINES(python2中,檔案物件有一個xreadlines()方法,返回一個迭代器,一次讀取檔案的一行。這在for迴圈中尤其實用。python3中,xreadlines()方法不再可用。
列表推導不再支援[n for n in a,b]語法,改為[n for n in (a,b)]或[n for n in [a,b]]
`a``=``1``b``=``2``c``=``[n ``for` `n ``in` `[a,b]]``print``(c)`
輸出[1,2]
更新異常的語法異常處理 在過去,捕獲異常的語法和異常引數/例項有以下形式。 except ValueError, e: 用相同的處理程式捕獲多個異常,會使用下面的語法。 except (ValueError, TypeError), e: 所需的圓括號使得一些使用者迷惑,因為他們經常嘗試編寫看起來像下面這樣的無效 程式碼。 except ValueError, TypeError, e: 新的 as 關鍵字是為了確保你不會因為原始語法中的逗號而混淆;然而,當你試圖使用相 同的處理程式捕獲一種以上的異常時,仍舊需要圓括號。這裡有兩個相同功能的新語法例子, 它們展示了這種變化:
except ValueError as e:except (ValueError, TypeError) as e:
raise ValueError, e
需要重點強調的是,你正在建立一種異常的一個例項,Python 3.x 中唯一支援的一種語 法如下所示。 raise ValueError(e) 這個語法其實一點也不新鮮。在超過 10 年前的 Python 1.5(是的,你沒有看錯)中就引 入了這種語法,當時異常由字串變化成類,類例項化的語法看起來更像是後者而非前者, 並且我們確信你會同意這一點