Python2.x與3.x版本有哪些主要的區別?

lhrbest發表於2019-01-15


Python2.x與 3.x 版本有哪些主要的區別?

Python 3.0 版本,常被稱為 Python 3000 ,或簡稱 Py3k 。相對於 Python 的早期版本,這是一個較大的升級。為了不帶入過多的累贅, Python 3 在設計的時候沒有考慮向下相容,即 Python 3 Python 2 是不相容的。

許多針對早期 Python 版本設計的程式都無法在 Python 3 上正常執行。為了照顧現有程式, Python 2.6 作為一個過渡版本,基本使用了 Python 2.x 的語法和庫,同時考慮了向 Python 3 的遷移,允許使用部分 Python 3 的語法與函式。

新的 Python 程式建議使用 Python 3 版本的語法。 Python 3 的變化主要在以下幾個方面 :

(一) print 函式

Python 3 中, 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() 語法:

from __future__ import print_function

print("fish", "panda", sep=', ')

(二) Unicode

Python 2 ASCII str() 型別, unicode() 是單獨的,不是 byte 型別。在 Python 3 中,有了 Unicode(utf-8) 字串,以及一個位元組類: byte bytearrays

由於 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

' 我愛北京天安門 '

(三) 除法運算

Python 中的除法較其它語言顯得非常高階,有套很複雜的規則。 Python 中的除法有兩個運算子, / // 。在 python 2.x 中,對於 / 除法,整數相除的結果是一個整數,把小數部分完全忽略掉,浮點數除法會保留小數點的部分得到一個浮點數的結果。在 python 3.x 中, / 除法不再這麼做了,對於整數之間的相除,結果也會是浮點數。

Python 2.x:

>>>1/2

>>>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)

>>>math.trunc(-1/2)

 

(四) 異常

Python 3 中處理異常也輕微的改變了,在 Python 3 中使用 as 作為關鍵詞。捕獲異常的語法由 except exc,var 改為 except exc as var

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

1. 2.x 時代,所有型別的物件都是可以被直接丟擲的,在 3.x 時代,只有繼承自 BaseException 的物件才可以被丟擲。

2.2.x raise 語句使用逗號將丟擲物件型別和引數分開, 3.x 取消了這種奇葩的寫法,直接呼叫建構函式丟擲物件即可。

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

(五) xrange

Python 2 中, xrange() 建立迭代物件的用法是非常流行的。例如, for 迴圈或者是列表、集合、字典推導式。但是這個 xrange-iterable 是無窮的,意味著可以無限遍歷。由於它的惰性求值,如果不得僅僅不遍歷它一次, xrange() 函式比 range() 更快(比如 for 迴圈)。儘管如此,對比迭代一次,不建議重複迭代多次,因為生成器每次都從頭開始。

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

python 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 中去掉了 <> ,只有 != 一種寫法。

(八) 去掉了 repr 表示式 ``

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

Python 3.x 中去掉了 `` 這種寫法,只允許使用 repr 函式,這樣做的目的是為了使程式碼看上去更清晰。

(九) 多個模組被改名(根據 PEP8

舊的名字

新的名字

_winreg

winreg

ConfigParser

configparser

copy_reg

copyreg

Queue

queue

SocketServer

socketserver

repr

reprlib

StringIO 模組現在被合併到新的 io 模組內。 new,md5,gopherlib 等模組被刪除。 Python 2.6 已經支援新的 IO 模組。

httplib BaseHTTPServer CGIHTTPServer SimpleHTTPServer Cookie cookielib 被合併到 http 包內。

取消了 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) .decode() (bytes -> str) 方法相互轉化。

>>> s = b.decode()

>>> s 'china'

>>> b1 = s.encode()

>>> b1

b'china'

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

(十一) input raw_input 函式

如果是 Python2 版本, 那麼 input raw_input 都可以使用 如果是 Python3 版本, 那麼 只能使用 input() 建議都使用 input()

raw_input 會將所有輸入的資料作為字串看待,返回值為字串型別; input 輸入時必須是一個合法的 Python 表示式,格式與 Python 中程式碼一樣 其返回值與輸入的資料型別相同




About Me

........................................................................................................................

● 本文作者:小麥苗,部分內容整理自網路,若有侵權請聯絡小麥苗刪除

● 本文在itpub( http://blog.itpub.net/26736162 )、部落格園( http://www.cnblogs.com/lhrbest )和個人weixin公眾號( xiaomaimiaolhr )上有同步更新

● 本文itpub地址: http://blog.itpub.net/26736162

● 本文部落格園地址: http://www.cnblogs.com/lhrbest

● 本文pdf版、個人簡介及小麥苗雲盤地址: http://blog.itpub.net/26736162/viewspace-1624453/

● 資料庫筆試面試題庫及解答: http://blog.itpub.net/26736162/viewspace-2134706/

● DBA寶典今日頭條號地址: http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826

........................................................................................................................

● QQ群號: 230161599 (滿) 、618766405

● weixin群:可加我weixin,我拉大家進群,非誠勿擾

● 聯絡我請加QQ好友 646634621 ,註明新增緣由

● 於 2019-01-01 06:00 ~ 2019-01-31 24:00 在魔都完成

● 最新修改時間:2019-01-01 06:00 ~ 2019-01-31 24:00

● 文章內容來源於小麥苗的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解

● 版權所有,歡迎分享本文,轉載請保留出處

........................................................................................................................

小麥苗的微店 https://weidian.com/s/793741433?wfr=c&ifr=shopdetail

小麥苗出版的資料庫類叢書 http://blog.itpub.net/26736162/viewspace-2142121/

小麥苗OCP、OCM、高可用網路班 http://blog.itpub.net/26736162/viewspace-2148098/

小麥苗騰訊課堂主頁 https://lhr.ke.qq.com/

........................................................................................................................

使用 weixin客戶端 掃描下面的二維碼來關注小麥苗的weixin公眾號( xiaomaimiaolhr )及QQ群(DBA寶典)、新增小麥苗weixin, 學習最實用的資料庫技術。

........................................................................................................................

歡迎與我聯絡

 

 



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26736162/viewspace-2558316/,如需轉載,請註明出處,否則將追究法律責任。

相關文章