全國咨詢/投訴熱線:400-618-9090

首頁技術文章正文

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

更新時間:2020年04月06日 23時42分51秒 來源:黑馬程序員

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

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來執行。


1578015474243_python2與python3.jpg


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

1、print 函數

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

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


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

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


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

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

 

在 Python 3.x 中這種類型的問題將不再經常發生。關于 Python 中使用 Unicode 的更 多信息,可以查看 Unicode HOWTO 文檔(請參閱 C.3 節的 Web 地址)。隨著新版本的 Python 采用了這種模型,用戶將不再需要使用 Unicode 和 ASCII/非 Unicode 字符串這些 術語。“Python 3.0 中的新內容”(What’s New in Python 3.0)文檔相當詳細地總結了這種 新模型。 Python 3 使用了文本(text)和(二進制)數據的概念,而非 Unicode 字符串和 8 位字符 串。所有的文本都是 Unicode 編碼的。然而,編碼的 Unicode 表示成二進制數據。用來保存 文本的類型是 str,而用來保存數據的類型是 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
'我愛北京天安門'


3、除法運算

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


4、不等運算符

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

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

 

5、輸入的不同

 

從鍵盤錄入一個字符串

原:
raw_input( "提示信息" )

改為:

input( "提示信息" )

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

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

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


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

6、模塊改名

StringIO模塊現在被合并到新的io模組內。 new, md5, gopherlib等模塊被刪除。

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

7、I/O方法XREADLINES()

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

8、列表推導

不再支持[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]

9、更新異常的語法

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

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

 

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

raise ValueError, e

 

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

1577370495235_學IT就到黑馬程序員.gif





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

在線咨詢 我要報名

11选5助手新免费版 快乐双彩中奖规则 云南快乐十分直三预测 基金配资比例两种模式 快乐8大小预测 山西快乐十分停售 黑龙江22选五开奖号 股票期权怎么行权 澳洲快乐8是不是真的 上海快三最新版本 内蒙古11选5胆码玩法 河北11选5走势 2020年香港今日开奖结果 浙江20选5中3个 佳永配资可以选择吗? 江西多乐彩开奖结果彩经网 江西快3三不同号号码