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

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

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

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

Python的3.0版本,常被稱為Python 3000,或簡(jiǎn)稱Py3k。相對(duì)于Python的早期版本,這是一個(gè)較大的升級(jí)。

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

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

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

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

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

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

Python 3.0的變化主要在以下幾個(gè)方面

print 函數(shù)

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

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

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

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


Unicode

目前 Python 用戶面對(duì)的又一個(gè)“陷阱”就是,字符串現(xiàn)在默認(rèn)為 Unicode 編碼。這種變 化不可能很快就來,當(dāng)處理 Unicode 和通常的 ASCII 字符串時(shí),無數(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 文檔(請(qǐng)參閱 C.3 節(jié)的 Web 地址)。隨著新版本的 Python 采用了這種模型,用戶將不再需要使用 Unicode 和 ASCII/非 Unicode 字符串這些 術(shù)語?!癙ython 3.0 中的新內(nèi)容”(What’s New in Python 3.0)文檔相當(dāng)詳細(xì)地總結(jié)了這種 新模型。 Python 3 使用了文本(text)和(二進(jìn)制)數(shù)據(jù)的概念,而非 Unicode 字符串和 8 位字符 串。所有的文本都是 Unicode 編碼的。然而,編碼的 Unicode 表示成二進(jìn)制數(shù)據(jù)。用來保存 文本的類型是 str,而用來保存數(shù)據(jù)的類型是 bytes。


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


由于 Python3.X 源碼文件默認(rèn)使用utf-8編碼,這就使得以下代碼是合法的:

>>> 中國(guó) = 'china'
>>>print(中國(guó))
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
'我愛北京天安門'


除法運(yùn)算

Python中的除法較其它語言顯得非常高端,有套很復(fù)雜的規(guī)則。Python中的除法有兩個(gè)運(yùn)算符,/和//

首先來說/除法:

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

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

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

而對(duì)于//除法,這種除法叫做floor除法,會(huì)對(duì)除法的結(jié)果自動(dòng)進(jìn)行一個(gè)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


不等運(yùn)算符

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

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

輸入的不同

1. 從鍵盤錄入一個(gè)字符串

原:

raw_input( "提示信息" )

改為:

input( "提示信息" )

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

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

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

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

模塊改名

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中,文件對(duì)象有一個(gè)xreadlines()方法,返回一個(gè)迭代器,一次讀取文件的一行。這在for循環(huán)中尤其實(shí)用。python3中,xreadlines()方法不再可用。

列表推導(dǎo)

不再支持[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ù)/實(shí)例有以下形式。 except ValueError, e: 用相同的處理程序捕獲多個(gè)異常,會(huì)使用下面的語法。 except (ValueError, TypeError), e: 所需的圓括號(hào)使得一些用戶迷惑,因?yàn)樗麄兘?jīng)常嘗試編寫看起來像下面這樣的無效 代碼。 except ValueError, TypeError, e: 新的 as 關(guān)鍵字是為了確保你不會(huì)因?yàn)樵颊Z法中的逗號(hào)而混淆;然而,當(dāng)你試圖使用相 同的處理程序捕獲一種以上的異常時(shí),仍舊需要圓括號(hào)。這里有兩個(gè)相同功能的新語法例子, 它們展示了這種變化:

except ValueError as e:

except (ValueError, TypeError) as e:

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

raise ValueError, e

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


分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!