當前位置:
首頁 > 最新 > 詳解Python 2.x與Python 3.x 的區別

詳解Python 2.x與Python 3.x 的區別

如果你是剛接觸 Python 的初學者,那你可能是直接學習 Python 3.x 版本。對於 Python 2.x 的版本是不會有所接觸。官方也宣布在 2020 停止對 Python 2.x 的維護。我也建議初學者直接去學 Python 3.x 版本。但我們還是要去了解下 Python 3.x 與 Python 2.x 之間都有哪些改變,通過對比能讓你對 Python 有更加深刻的理解。並且在很多面試過程中,面試官都會問:Python 2.x 與 Python 3.x 的區別。今天就給大家列舉 Python 3.0 主要改變的幾個方面。


Py3K

Python 的 3.0 版本,常被稱為 Python 3000,或簡稱 Py3K。

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

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


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

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


Python 2 有 ASCII str() 類型,unicode() 是單獨的,不是 byte 類型。 現在,在 Python 3 ,我們最終有了 Unicode(utf-8) 字元串,以及一個位元組類:byte 和 bytearrays。 由於 Python 3.x 源碼文件默認使用 uft-8 編碼,這就使得以下代碼是合法的:


Python 中的除法較其它語言顯得非常高端,有套很複雜的規則。Python 中的除法有兩個運算符,/ 和 // 首先來說下 / 除法:

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

在 python3.x 中 / 除法不再這麼做了,對於整數之間的相除,結果也會是浮點數。

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

而 floor 除法指的是返回數字的下舍整數,在 Python 中有個 floor 函數,它不能直接訪問,需要導入 math 模塊,通過靜態對象調用該方法。舉個例子:

注意的是並不是捨棄小數部分,而是執行 floor 操作,如果要截取小數部分,那麼需要使用 math 模塊的 trunc 函數

4 異常

在 Python 3 中處理異常也輕微的改變了,在 Python 3 中我們現在使用 as 作為關鍵詞。

捕獲異常的語法由 except exc, var 改為 except exc as var。

使用語法 except (exc1, exc2) as var 可以同時捕獲多種類別的異常。 Python 2.6 已經支持這兩種語法。

在 2.x 時代,所有類型的對象都是可以被直接拋出的,在 3.x 時代,只有繼承自 BaseException 的對象才可以被拋出。

2.x raise 語句使用逗號將拋出對象類型和參數分開,3.x 取消了這種奇葩的寫法,直接調用構造函數拋出對象即可。

在 2.x 時代,異常在代碼中除了表示程序錯誤,還經常做一些普通控制結構應該做的事情,在 3.x 中可以看出,設計者讓異常變的更加專一,只有在錯誤發生的情況才能去用異常捕獲語句來處理。


在 Python 2 中 xrange() 創建迭代對象的用法是非常流行的。比如: for 循環或者是列表/集合/字典推導式。

這個表現十分像生成器(比如。"惰性求值")。但是這個 xrange-iterable 是無窮的,意味著你可以無限遍歷。

由於它的惰性求值,如果你不得僅僅不遍歷它一次,xrange() 函數 比 range() 更快(比如 for 循環)。儘管如此,對比迭代一次,不建議你重複迭代多次,因為生成器每次都從頭開始。

惰性求值:惰性求值,也就是延遲求值,表達式不會在它被綁定到變數之後就立即求值,而是等用到時再求值。

作用:這個特性可以解決一些巨大甚至無限的集合列表,延遲求值的一個好處是能夠建立可計算的無限列表,而沒有妨礙計算的無限循環或大小問題。

Python 中的很多方法沒有直接返回列表,而是返回了一個可迭代的 generator (生成器)對象,這便是 python 的惰性求值。

在 Python 3 中,range() 是像 xrange() 那樣實現以至於一個專門的 xrange() 函數都不再存在(在 Python 3 中 xrange() 會拋出命名異常)。


八進位數必須寫成 0o777,原來的形式 0777 不能用了;二進位必須寫成 0b111。

新增了一個 bin() 函數用於將一個整數轉換成二進位字串。 Python 2.6 已經支持這兩種語法。

在 Python 3.x 中,表示八進位字面量的方式只有一種,就是 0o1000。


Python 2.x 中不等於有兩種寫法 != 和

Python 3.x 中去掉了 ,只有 != 一種寫法。


Python 2.x 中反引號 `` 相當於 repr 函數的作用

Python 3.x 中去掉了 `` 這種寫法,只允許使用 repr 函數。

repr 是什麼:repr() 函數將對象轉化為供解釋器讀取的形式,返回一個對象的 string 格式。

, , , , , 被合併到 包內。 模塊現在被合併到新的 io 模組內。 , , 等模塊被刪除。 Python 2.6 已經支援新的 模組。

取消了 語句,只剩下 函數。 Python 2.6 已經支援 函數。


1)Py3.X 去除了 long 類型,現在只有一種整型——int,但它的行為就像 2.X 版本的 long。

2)新增了 bytes 類型,對應於 2.x 版本的八位串,定義一個 bytes 字面量的方法如下:

str 對象和 bytes 對象可以使用 .encode() (str -> bytes) or .decode() (bytes -> str) 方法相互轉化。

3)dict 的 .keys()、.items 和 .values() 方法返回迭代器,而之前的 iterkeys() 等函數都被廢棄。同時去掉的還有 dict.has_key(),用 in 替代它。


原先有兩種打開方式: 或 現在改成只能用


原先:

raw_input("提示信息") 現在:

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

rawinput():將所有輸入作為字元串看待,返回字元串類型 input():只能接收"數字"的輸入,在對待純數字輸入時具有自己的特性,它返回所輸入的數字的類型(int, float ) 在 python3.x 中 rawinput() 和 input( ) 進行了整合,去除了 raw_input(),僅保留了 input() 函數,其接收任意任性輸入,將所有輸入默認為字元串處理,並返回字元串類型。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python 的精彩文章:

使用 Python 一鍵配置 SVN 賬號和屬組信息
用Python編寫FPGA乙太網MAC

TAG:Python |