全國(guó)咨詢(xún)/投訴熱線(xiàn):400-618-4000

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

python2 和python3發(fā)生了哪些變化?一篇文章讓你搞懂!

更新時(shí)間:2020-01-03 來(lái)源:黑馬程序員 瀏覽量:

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

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

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

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

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

新的Python程式建議使用Python 3.0版本的語(yǔ)法。

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

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


1578015474243_python2與python3.jpg


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

1、print 函數(shù)

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

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


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

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


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

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

 

在 Python 3.x 中這種類(lèi)型的問(wèn)題將不再經(jīng)常發(fā)生。關(guān)于 Python 中使用 Unicode 的更 多信息,可以查看 Unicode HOWTO 文檔(請(qǐng)參閱 C.3 節(jié)的 Web 地址)。隨著新版本的 Python 采用了這種模型,用戶(hù)將不再需要使用 Unicode 和 ASCII/非 Unicode 字符串這些 術(shù)語(yǔ)。“Python 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ù)。用來(lái)保存 文本的類(lèi)型是 str,而用來(lái)保存數(shù)據(jù)的類(lèi)型是 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 = "我愛(ài)北京天安門(mén)"
>>> str
'\xe6\x88\x91\xe7\x88\xb1\xe5\x8c\x97\xe4\xba\xac\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8'
>>> str = u"我愛(ài)北京天安門(mén)"
>>> str
u'\u6211\u7231\u5317\u4eac\u5929\u5b89\u95e8'

Python 3.x

>>> str = "我愛(ài)北京天安門(mén)"
>>> str
'我愛(ài)北京天安門(mén)'


3、除法運(yùn)算

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

首先來(lái)說(shuō)/除法:

在python 2.x中/除法就跟我們熟悉的大多數(shù)語(yǔ)言,比如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


4、不等運(yùn)算符

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

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

 

5、輸入的不同

 

從鍵盤(pán)錄入一個(gè)字符串

原:
raw_input( "提示信息" )

改為:

input( "提示信息" )

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

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

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


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

6、模塊改名

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

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

7、I/O方法XREADLINES()

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

8、列表推導(dǎo)

不再支持[n for n in a,b]語(yǔ)法,改為[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]

9、更新異常的語(yǔ)法

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

except ValueError as e:
except (ValueError, TypeError) as e:

 

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

raise ValueError, e

 

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

1577370495235_學(xué)IT就到黑馬程序員.gif





猜你喜歡:
最新Python安裝圖文教程
Python基礎(chǔ)視頻教程下載

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