若是你是剛接觸 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 主要改變的幾個方面。python
Python 的 3.0 版本,常被稱爲 Python 3000,或簡稱 Py3K。面試
爲了照顧現有程式,Python 2.6 做爲一個過分版本,基本使用了 Python 2.x 得語法和庫,同時考慮了向 Pythn 3.0 得遷移,容許使用部分 Python 3.0 的語法與函數。python3.x
Python 3.0 的變化主要在如下幾個方面:cookie
print 語句沒有了,取而代之的是 print() 函數。Python 2.6 與 Python 2.7 部分地支持這種形式的 print 語法。在 Python 2.6 與 Python 2.7 裏面,如下三種形式是等價的:函數
print "fish" print ("fish") # 注意 print 後面有個空格 print("fish") # print() 不能帶有任何其它參數
而後,Python 2.6 實際已經支持新得 print() 語法:oop
from __future__ import print_function print("fish", "panda", sep=", ")
Python 2 有 ASCII str() 類型,unicode() 是單獨的,不是 byte 類型。學習
如今,在 Python 3 ,咱們最終有了 Unicode(utf-8) 字符串,以及一個字節類:byte 和 bytearrays。編碼
因爲 Python 3.x 源碼文件默認使用 uft-8 編碼,這就使得如下代碼是合法的:spa
>>> 中國 = '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
Python 3.x
>>> str = "我愛北京天安門" >>> str '我愛北京天安門'
Python 中的除法較其它語言顯得很是高端,有套很複雜的規則。Python 中的除法有兩個運算符,/ 和 // 首先來講下 / 除法:
在 python 2.x 中 / 除法就跟咱們熟悉的大多數語言,好比 Java、C 差很少,整數相除的結果是一個整數,把小數部分徹底忽略掉,浮點數除法會保留小數點的部分獲得一個浮點數的結果。
在 python3.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 中是一致的。
而 floor 除法指的是返回數字的下舍整數,在 Python 中有個 floor 函數,它不能直接訪問,須要導入 math 模塊,經過靜態對象調用該方法。舉個例子:
import math # This will import math module print "math.floor(-45.17) : ", math.floor(-45.17)
輸出結果:
math.floor(-45.17) : -46.0
python 2.x:
>>> -1 // 2 -1
注意的是並非捨棄小數部分,而是執行 floor 操做,若是要截取小數部分,那麼須要使用 math 模塊的 trunc 函數
python 3.x
>>> import math >>> math.trunc(1 / 2) 0 >>> math.trunc(-1 / 2) 0
在 Python 3 中處理異常也輕微的改變了,在 Python 3 中咱們如今使用 as 做爲關鍵詞。
捕獲異常的語法由 except exc, var 改成 except exc as var。
使用語法 except (exc1, exc2) as var 能夠同時捕獲多種類別的異常。 Python 2.6 已經支持這兩種語法。
在 2.x 時代,異常在代碼中除了表示程序錯誤,還常常作一些普通控制結構應該作的事情,在 3.x 中能夠看出,設計者讓異常變的更加專注,只有在錯誤發生的狀況才能去用異常捕獲語句來處理。
在 Python 2 中 xrange() 建立迭代對象的用法是很是流行的。好比: for 循環或者是列表/集合/字典推導式。
這個表現十分像生成器(好比。"惰性求值")。可是這個 xrange-iterable 是無窮的,意味着你能夠無限遍歷。
因爲它的惰性求值,若是你不得僅僅不遍歷它一次,xrange() 函數 比 range() 更快(好比 for 循環)。儘管如此,對比迭代一次,不建議你重複迭代屢次,由於生成器每次都從頭開始。
惰性求值:惰性求值,也就是延遲求值,表達式不會在它被綁定到變量以後就當即求值,而是等用到時再求值。
做用:這個特性能夠解決一些巨大甚至無限的集合列表,延遲求值的一個好處是可以創建可計算的無限列表,而沒有妨礙計算的無限循環或大小問題。
Python 中的不少方法沒有直接返回列表,而是返回了一個可迭代的 generator (生成器)對象,這即是 python 的惰性求值。
在 Python 3 中,range() 是像 xrange() 那樣實現以致於一個專門的 xrange() 函數都再也不存在(在 Python 3 中 xrange() 會拋出命名異常)。
import timeit n = 10000 def test_range(n): return for i in range(n): pass def test_xrange(n): for i in xrange(n): pass
Python 2
print 'Python', python_version() print '\ntiming range()' %timeit test_range(n) print '\n\ntiming xrange()' %timeit test_xrange(n) Python 2.7.6 timing range() 1000 loops, best of 3: 433 µs per loop timing xrange() 1000 loops, best of 3: 350 µs per loop
Python 3
print('Python', python_version()) print('\ntiming range()') %timeit test_range(n) Python 3.4.1 timing range() 1000 loops, best of 3: 520 µs per loop
print(xrange(10)) --------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-5-5d8f9b79ea70> in <module>() ----> 1 print(xrange(10)) NameError: name 'xrange' is not defined
八進制數必須寫成 0o777,原來的形式 0777 不能用了;二進制必須寫成 0b111。
新增了一個 bin() 函數用於將一個整數轉換成二進制字串。 Python 2.6 已經支持這兩種語法。
在 Python 3.x 中,表示八進制字面量的方式只有一種,就是 0o1000。
pyhon 2.x
>>> 0o1000 512 >>> 01000 512
python 3.x
>>> 01000 File "<stdin>", line 1 01000 ^ SyntaxError: invalid token >>> 0o1000 512
Python 2.x 中不等於有兩種寫法 != 和 <>
Python 3.x 中去掉了 <>,只有 != 一種寫法。
Python 2.x 中反引號 `` 至關於 repr 函數的做用
Python 3.x 中去掉了 `` 這種寫法,只容許使用 repr 函數。
repr 是什麼:repr() 函數將對象轉化爲供解釋器讀取的形式,返回一個對象的 string 格式。
httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib 被合併到 http 包內。StringIO 模塊如今被合併到新的 io 模組內。 new, md5, gopherlib 等模塊被刪除。 Python 2.6 已經支援新的 io 模組。
取消了 exec 語句,只剩下 exec() 函數。 Python 2.6 已經支援 exec() 函數。
1)Py3.X 去除了 long 類型,如今只有一種整型——int,但它的行爲就像 2.X 版本的 long。
2)新增了 bytes 類型,對應於 2.x 版本的八位串,定義一個 bytes 字面量的方法以下:
>>> b = b'china' >>> type(b) <type 'bytes'>
str 對象和 bytes 對象可使用 .encode() (str -> bytes) or .decode() (bytes -> str) 方法相互轉化。
>>> s = b.decode() >>> s 'china' >>> b1 = s.encode() >>> b1 b'china'
3)dict 的 .keys()、.items 和 .values() 方法返回迭代器,而以前的 iterkeys() 等函數都被廢棄。同時去掉的還有 dict.has_key(),用 in 替代它。
原先有兩種打開方式:
file( ..... ) 或 open(.....)
如今改爲只能用
open(......)
raw_input("提示信息")
如今:
input("提示信息")
在 python2.x 中 raw_input() 和 input( ),兩個函數都存在,其中區別爲:
在 python3.x 中 raw_input() 和 input( ) 進行了整合,去除了 raw_input(),僅保留了 input() 函數,其接收任意任性輸入,將全部輸入默認爲字符串處理,並返回字符串類型。
本文首發於公衆號「癡海」,後臺回覆「1024」,領取最新 Python 教程。