Python2.x與3.x版本有哪些主要的區別?
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux系統常用的版本有哪些?有何區別呢?Linux
- 伺服器與PC區別有哪些伺服器
- SAP與ERP管理系統的區別有哪些
- IPv4與IPv6的區別有哪些?
- Docker有哪些特點?與Linux有什麼區別?DockerLinux
- 有關Python2.x版本下的dis模組的使用Python
- 簡單介紹下python2.x與python3.x的區別Python
- htmlentities和htmlspecialchars 的區別有哪些HTML
- HTTP和HTTPS的區別有哪些?HTTP
- Java堆疊的區別有哪些Java
- IPv4與IPv6有哪些區別?
- 雲伺服器與物理機有哪些區別?伺服器
- Linux中open與fopen區別主要體現在哪些方面?Linux
- HTTP代理與SOCKS代理的主要區別HTTP
- HTTP和HTTPS有什麼主要的區別?HTTP
- python2.x和python3.x區別Python
- Altair SimSolid與其他模擬求解器有哪些區別AISolid
- python堆和棧的區別有哪些Python
- require()、import、import()有哪些區別?UIImport
- @Autowired和@Resource有哪些區別
- HTTP和HTTPS有哪些區別?HTTP
- Linux中程式與程式分別指什麼?兩者的區別有哪些?Linux
- 等保、分保是什麼?等保與分保的區別有哪些?
- 獨享與共享頻寬有哪些區別?如何選擇?
- 聚合支付商家收款碼與普通收款碼有哪些區別?
- 雲伺服器與普通伺服器有哪些區別?伺服器
- PHP與Python有什麼區別?各具有哪些特點?PHPPython
- Python和access的區別有哪些?Python教程Python
- Git與其他版本控制系統的區別Git
- Python和C#有哪些區別?PythonC#
- SOLIDWORKS各版本間有什麼區別?Solid
- 【雲端計算】私有云是什麼?主要集中在哪些行業?與公有云有什麼區別?行業
- 駭客型別有哪些?他們有什麼區別?型別
- 動態IP與靜態IP的主要區別
- SOCKS代理與HTTP代理主要區別分析HTTP
- Linux中less和more命令的區別有哪些?Linux
- surging版本有哪些?
- 全新的WiFi Explorer Pro 3已推出,與之前的WiFi Explorer有何區別?有哪些改進?WiFi