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 語句沒有了,取而代之的是 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=', ')

如果 Python2.x 版本想使用使用 Python3.x 的 print 函數,可以導入 __future__ 包,該包禁用 Python2.x 的 print 語句,采用 Python3.x 的 print 函數:

實例

>>> list =["a", "b", "c"]
>>> print list    # python2.x 的 print 語句
['a', 'b', 'c']
>>> from __future__ import print_function  # 導入 __future__ 包
>>> print list     # Python2.x 的 print 語句被禁用,使用報錯
  File "<stdin>", line 1
    print list
             ^
SyntaxError: invalid syntax
>>> print (list)   # 使用 Python3.x 的 print 函數
['a', 'b', 'c']
>>>

Python3.x 與 Python2.x 的許多兼容性設計的功能可以通過 __future__ 這個包來導入。


Unicode

Python 2 有 ASCII str() 類型,unicode() 是單獨的,不是 byte 類型。

現在, 在 Python 3,我們最終有了 Unicode (utf-8) 字符串,以及一個字節類:byte 和 bytearrays。

由于 Python3.x 源碼文件默認使用 utf-8 編碼,所以使用中文就更加方便了:

>>> 中國 = 'china' >>>print(中國) china

Python 2.x

>>> str = "我愛北京天安門" >>> str '\xe6\x88\x91\xe7\x88\xb1\xe5\x8c\x97\xe4\xba\xac\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8' >>> str = u"我愛北京天安門" >>> str
u'\u6211\u7231\u5317\u4eac\u5929\u5b89\u95e8'

Python 3.x

>>> str = "我愛北京天安門" >>> str '我愛北京天安門'

除法運算

Python 中的除法較其它語言顯得非常高端,有套很復雜的規則。Python 中的除法有兩個運算符,/ 和 //

首先來說 / 除法:

在 Python 2.x 中 / 除法就跟我們熟悉的大多數語言,比如 Java 和 C ,整數相除的結果是一個整數,把小數部分完全忽略掉,浮點數除法會保留小數點的部分得到一個浮點數的結果。

在 Python 3.x 中 / 除法不再這么做了,對于整數之間的相除,結果也會是浮點數。

Python 2.x:

>>> 1 / 2 0 >>> 1.0 / 2.0 0.5

Python 3.x:

>>> 1/2 0.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 3 中處理異常也輕微的改變了,在 Python 3 中我們現在使用 as 作為關鍵詞。

捕獲異常的語法由 except exc, var 改為 except exc as var。

使用語法except (exc1, exc2) as var 可以同時捕獲多種類別的異常。 Python 2.6 已經支持這兩種語法。

  • 1. 在 2.x 時代,所有類型的對象都是可以被直接拋出的,在 3.x 時代,只有繼承自BaseException的對象才可以被拋出。
  • 2. 2.x raise 語句使用逗號將拋出對象類型和參數分開,3.x 取消了這種奇葩的寫法,直接調用構造函數拋出對象即可。

在 2.x 時代,異常在代碼中除了表示程序錯誤,還經常做一些普通控制結構應該做的事情,在 3.x 中可以看出,設計者讓異常變的更加專一,只有在錯誤發生的情況才能去用異常捕獲語句來處理。

文章內容屬作者個人觀點,不代表本站立場,如有侵權立刪。