首頁技術(shù)文章正文

python2 和python3發(fā)生了哪些變化?

更新時間:2020-08-13 來源:黑馬程序員 瀏覽量:

Python 3 代表 Python 語言進化的一個產(chǎn)物,所以它不會執(zhí)行大多數(shù)針對 Python 2.x 版本 解釋器所寫的舊代碼。但是,這并不意味著你不能識別舊有的代碼,或者需要廣泛的移植才 能使舊代碼工作于 3.x 版本下。事實上,新的語法與過去的語法非常相似。然而,因為 print 語句在新版本中不再存在,所以它很容易破壞舊有的代碼。附錄將討論 print 和版本 3.x 的其 他變化,并且將著重強調(diào)為了使其更優(yōu)秀,Python 必須進行的一些改進。最后,我們給出了 一些遷移工具,它們可能有助于你實現(xiàn)這一轉(zhuǎn)變。

Python的3.0版本,常被稱為Python 3000,或簡稱Py3k。相對于Python的早期版本,這是一個較大的升級。

為了不帶入過多的累贅,Python 3.0在設(shè)計的時候沒有考慮向下相容。

許多針對早期Python版本設(shè)計的程式都無法在Python 3.0上正常執(zhí)行。

為了照顧現(xiàn)有程式,Python 2.6作為一個過渡版本,基本使用了Python 2.x的語法和庫,同時考慮了向Python 3.0的遷移,允許使用部分Python 3.0的語法與函數(shù)。

新的Python程式建議使用Python 3.0版本的語法。

除非執(zhí)行環(huán)境無法安裝Python 3.0或者程式本身使用了不支援Python 3.0的第三方庫。目前不支援Python 3.0的第三方庫有Twisted, py2exe, PIL等。

大多數(shù)第三方庫都正在努力地相容Python 3.0版本。即使無法立即使用Python 3.0,也建議編寫相容Python 3.0版本的程式,然后使用Python 2.6, Python 2.7來執(zhí)行。

Python 3.0的變化主要在以下幾個方面

print 函數(shù)

print語句沒有了,取而代之的是print()函數(shù)。 Python 2.6與Python 2.7部分地支持這種形式的print語法。在Python 2.6與Python 2.7里面,以下三種形式是等價的:

print "hello"
print ("python")    #注意print后面有個空格
print("app")    #print()不能帶有任何其它參數(shù)

然而,Python 2.6實際已經(jīng)支持新的print()語法:

from __future__ import print_function
print("hello", "python","app", sep=',')


Unicode

目前 Python 用戶面對的又一個“陷阱”就是,字符串現(xiàn)在默認為 Unicode 編碼。這種變 化不可能很快就來,當處理 Unicode 和通常的 ASCII 字符串時,無數(shù)的 Python 開發(fā)人員遇到 這種問題已經(jīng)不止一兩天了。這種問題看起來如下所示。

UnicodeEncodeError: 'ascii' codec can't encode character
u'\xae' in position 0: ordinal not in range(128)


在 Python 3.x 中這種類型的問題將不再經(jīng)常發(fā)生。關(guān)于 Python 中使用 Unicode 的更 多信息,可以查看 Unicode HOWTO 文檔(請參閱 C.3 節(jié)的 Web 地址)。隨著新版本的 Python 采用了這種模型,用戶將不再需要使用 Unicode 和 ASCII/非 Unicode 字符串這些 術(shù)語?!癙ython 3.0 中的新內(nèi)容”(What’s New in Python 3.0)文檔相當詳細地總結(jié)了這種 新模型。 Python 3 使用了文本(text)和(二進制)數(shù)據(jù)的概念,而非 Unicode 字符串和 8 位字符 串。所有的文本都是 Unicode 編碼的。然而,編碼的 Unicode 表示成二進制數(shù)據(jù)。用來保存 文本的類型是 str,而用來保存數(shù)據(jù)的類型是 bytes。


python2python3是否可變
str("")bytes(b"")
unicode(u"")str("")
N/Abytearray


由于 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中的除法較其它語言顯得非常高端,有套很復雜的規(guī)則。Python中的除法有兩個運算符,/和//

首先來說/除法:

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

在python 3.x中/除法不再這么做了,對于整數(shù)之間的相除,結(jié)果也會是浮點數(shù)。

Python 2.x:
>>> 1 / 2
0
>>> 1.0 / 2.0
0.5
Python 3.x:
>>> 1/2
0.5

而對于//除法,這種除法叫做floor除法,會對除法的結(jié)果自動進行一個floor操作,在python 2.x和python 3.x中是一致的。

python 2.x:

>>> -1 // 2
-1
python 3.x:
>>> -1 // 2
-1

注意的是并不是舍棄小數(shù)部分,而是執(zhí)行 floor 操作,如果要截取整數(shù)部分,那么需要使用 math 模塊的 trunc 函數(shù)

python 3.x:

>>> import math
>>> math.trunc(1 / 2)
0
>>> math.trunc(-1 / 2)
0


不等運算符

Python 2.x中不等于有兩種寫法 != 和 <>

Python 3.x中去掉了<>, 只有!=一種寫法,還好,我從來沒有使用<>的習慣

輸入的不同

1. 從鍵盤錄入一個字符串

原:

raw_input( "提示信息" )

改為:

input( "提示信息" )

在python2.x中raw_input()和input( ),兩個函數(shù)都存在,其中區(qū)別為:

·raw_input()---將所有輸入作為字符串看待,返回字符串類型

·input()-----只能接收"數(shù)字"的輸入,在對待純數(shù)字輸入時具有自己的特性,它返回所輸入的數(shù)字的類型(int, float )

在python3.x中rawinput()和input( )進行了整合,去除了rawinput(),僅保留了input()函數(shù),其接收任意任性輸入,將所有輸入默認為字符串處理,并返回字符串類型。

模塊改名

StringIO模塊現(xiàn)在被合并到新的io模組內(nèi)。 new, md5, gopherlib等模塊被刪除。

httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib被合并到http包內(nèi)。 取消了exec語句,只剩下exec()函數(shù)。

I/O方法XREADLINES()

python2中,文件對象有一個xreadlines()方法,返回一個迭代器,一次讀取文件的一行。這在for循環(huán)中尤其實用。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]

更新異常的語法

異常處理 在過去,捕獲異常的語法和異常參數(shù)/實例有以下形式。 except ValueError, e: 用相同的處理程序捕獲多個異常,會使用下面的語法。 except (ValueError, TypeError), e: 所需的圓括號使得一些用戶迷惑,因為他們經(jīng)常嘗試編寫看起來像下面這樣的無效 代碼。 except ValueError, TypeError, e: 新的 as 關(guān)鍵字是為了確保你不會因為原始語法中的逗號而混淆;然而,當你試圖使用相 同的處理程序捕獲一種以上的異常時,仍舊需要圓括號。這里有兩個相同功能的新語法例子, 它們展示了這種變化:

except ValueError as e:

except (ValueError, TypeError) as e:

自 Python 2.6 以來,之后發(fā)行的 2.x 版本在創(chuàng)建異常處理程序時都開始接受這兩種形式, 從而促進了移植過程??梢栽?PEP 3110 找到關(guān)于該變化的更多信息。 拋出異常 Python 2.x 中拋出異常的最受歡迎的語法如下所示。

raise ValueError, e

需要重點強調(diào)的是,你正在創(chuàng)建一種異常的一個實例,Python 3.x 中唯一支持的一種語 法如下所示。 raise ValueError(e) 這個語法其實一點也不新鮮。在超過 10 年前的 Python 1.5(是的,你沒有看錯)中就引 入了這種語法,當時異常由字符串變化成類,類實例化的語法看起來更像是后者而非前者, 并且我們確信你會同意這一點。


分享到:
在線咨詢 我要報名
和我們在線交談!