更新時(shí)間:2020-01-03 來(lái)源:黑馬程序員 瀏覽量:
Python 3 代表 Python 語(yǔ)言進(jìn)化的一個(gè)產(chǎn)物,所以它不會(huì)執(zhí)行大多數(shù)針對(duì) Python 2.x 版本 解釋器所寫的舊代碼。但是,這并不意味著你不能識(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版本,常被稱為Python 3000,或簡(jiǎn)稱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,也建議編寫相容Python 3.0版本的程式,然后使用Python 2.6, Python 2.7來(lái)執(zhí)行。
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 用戶面對(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 中這種類型的問(wèn)題將不再經(jīng)常發(fā)生。關(guān)于 Python 中使用 Unicode 的更 多信息,可以查看 Unicode HOWTO 文檔(請(qǐng)參閱 C.3 節(jié)的 Web 地址)。隨著新版本的 Python 采用了這種模型,用戶將不再需要使用 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)保存 文本的類型是 str,而用來(lái)保存數(shù)據(jù)的類型是 bytes。
python2 | python3 | 是否可變 |
str("") | bytes(b"") | 否 |
unicode(u"") | str("") | 否 |
N/A | bytearray | 是 |
由于 Python3.X 源碼文件默認(rèn)使用utf-8編碼,這就使得以下代碼是合法的:
>>> 中國(guó) = 'china'
>>>print(中國(guó))
china
Python 2.x
>>> str = "我愛(ài)北京天安門"
>>> 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)北京天安門"
>>> str
u'\u6211\u7231\u5317\u4eac\u5929\u5b89\u95e8'
Python 3.x
>>> str = "我愛(ài)北京天安門"
>>> str
'我愛(ài)北京天安門'
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中不等于有兩種寫法 != 和 <>
Python 3.x中去掉了<>, 只有!=一種寫法,還好,我從來(lái)沒(méi)有使用<>的習(xí)慣
5、輸入的不同
從鍵盤錄入一個(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)為字符串處理,并返回字符串類型。
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)使得一些用戶迷惑,因?yàn)樗麄兘?jīng)常嘗試編寫看起來(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í)異常由字符串變化成類,類實(shí)例化的語(yǔ)法看起來(lái)更像是后者而非前者, 并且我們確信你會(huì)同意這一點(diǎn)。