Python 3.0在設計的時候沒有考慮向下相容。許多針對早期Python版本設計的程式都無法在Python 3.0上正常執行。
pyython3.x和python2.x的版本差別
為了照顧現有程式,Python 2.6作為一個過渡版本,基本使用了Python 2.x的文法和庫,同時考慮了向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來執行。
python 3.0 中使用print()函數來輸出,而不再使用print語句。
print("zxp") #python3.0
print "zxp" #python3.0不再支援
在python2.6和python2.7中,三種形式等價:
print("zxp")# print不能帶任何參數
print ("zxp") #print後有空格
print "zxp"
python2.6實際已經支援print()文法:
seq = 'hello'
print('zxp','panda',seq)
Unicode
python2中有ASCII str()類型,unicode()是單獨的,不是byte類型。
python3中有Unicode(utf-8)字元串,以及一個位元組類:byte和bytearrays。
python3.x源碼檔案預設使用utf-8:
>>>中國 = “china”
>>>print(中國)
china
而在python2.x中是文法錯誤
python2.x
>>> 中國 = "china"
SyntaxError: invalid syntax
>>> str = "我是霸王"
>>> str
'\xce\xd2\xca\xc7\xb0\xd4\xcd\xf5'
>>> print str
我是霸王
>>> str = u'我是霸王'
>>> str
u'\u6211\u662f\u9738\u738b'
python3.x
>>> str = "我是霸王"
>>> str
'我是霸王'
>>> print(str)
我是霸王
除法運算
python中除法包括兩個運算符,
/
和
//
python2.x中的
/
除法,跟java、c相同,整數相除結果是一個整數,把小數忽略掉。浮點數的除法會保留小數部分,得到一個浮點數結果。
python3.x中
/
除法對于整數之間相除,結果也會是浮點數
python2.x
>>> 3/2
1
python3.x
>>> 3/2
1.5
而對于
//
除法,被稱為floor除法(python3.x中的floor),會對除法的結果自動進行一個floor操作,在python2.x和python3.x中是一緻的
>>> 5//3
1
python3.x中floor操作:向下取整,小數不存在
>>> import math
>>> math.floor(2.2)
2
python2.x中floor操作:向下取整,小數存在,仍然是浮點數
>>> math.floor(3.2)
3.0
如果需要取整,需要
trunc
函數
>>> import math
>>> math.trunc(5/3)
1
異常
在 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.x raise語句使用逗号将抛出對象類型和參數分開,3.x取消了這種奇葩的寫法,直接調用構造函數抛出對象即可。
建立疊代對象
在Python 2 中 xrange() 建立疊代對象的用法是非常流行的。比如: for 循環或者是清單/集合/字典推導式。這個表現十分像生成器(比如。”惰性求值”)。但是這個 xrange-iterable 是無窮的,意味着你可以無限周遊。由于它的惰性求值,如果你不得僅僅不周遊它一次,xrange() 函數 比 range() 更快(比如 for 循環)。盡管如此,對比疊代一次,不建議你重複疊代多次,因為生成器每次都從頭開始。
在 Python 3 中,range() 是像 xrange() 那樣實作以至于一個專門的 xrange() 函數都不再存在(在 Python 3 中 xrange() 會抛出命名異常)。
python2.x中使用xrange()和range()
>>> range(1,10,2)
[1, 3, 5, 7, 9]
>>> xrange(1,10,2)
xrange(1, 11, 2)
>>> list(xrange(1,10,2))
[1, 3, 5, 7, 9]
python3.x中使用range(),内容包含了xrange()
>>> xrange(10)
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
xrange(10)
NameError: name 'xrange' is not defined
>>> range(10)
range(0, 10)
>>> list(range(1,10))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
八進制字面量表示
八進制數必須寫成0o777,原來的形式0777不能用了;二進制必須寫成0b111。
新增了一個bin()函數用于将一個整數轉換成二進制字串。 Python 2.6已經支援這兩種文法。
在Python 3.x中,表示八進制字面量的方式隻有一種,就是0o1000。
>>> 0777
SyntaxError: invalid token
>>> 0o777
511
python2.x
>>> 0777
511
>>> 0o777
511
不等于運算符
Python 2.x中不等于有兩種寫法 != 和 <>
Python 3.x中去掉了<>, 隻有!=一種寫法,還好,我從來沒有使用<>的習慣
資料類型
python3.x中不再有long類型,隻有一種整性int,當它的行為跟python2.x的long相同
python3.x中,字元串和bytes類型徹底分開了。字元串是以字元為機關進行處理的,bytes類型是以位元組為機關處理的。
bytes
bytes資料類型在所有的操作和使用甚至内置方法上和字元串資料類型基本一樣,也是不可變的序列對象。
bytes對象隻負責以二進制位元組序列的形式記錄所需記錄的對象,至于該對象到底表示什麼(比如到底是什麼字元)則由相應的編碼格式解碼所決定。Python3中,bytes通常用于網絡資料傳輸、二進制圖檔和檔案的儲存等等。可以通過調用bytes()生成bytes執行個體,其值形式為 b’xxxxx’,其中 ‘xxxxx’ 為一至多個轉義的十六進制字元串(單個 x 的形式為:\x12,其中\x為小寫的十六進制轉義字元,12為二位十六進制數)組成的序列,每個十六進制數代表一個位元組(八位二進制數,取值範圍0-255),對于同一個字元串如果采用不同的編碼方式生成bytes對象,就會形成不同的值.
b = b'' # 建立一個空的bytes
b = byte() # 建立一個空的bytes
b = b'hello' # 直接指定這個hello是bytes類型
b = bytes('string',encoding='編碼類型') #利用内置bytes方法,将字元串轉換為指定編碼的bytes
b = str.encode('編碼類型') # 利用字元串的encode方法編碼成bytes,預設為utf-8類型
bytes.decode('編碼類型'):将bytes對象解碼成字元串,預設使用utf-8進行解碼。
對于bytes,我們隻要知道在Python3中某些場合下強制使用,以及它和字元串類型之間的互相轉換,其它的基本照抄字元串。
簡單的省事模式:
string = b'xxxxxx'.decode()
直接以預設的utf-8編碼解碼bytes成string
b = string.encode()
直接以預設的utf-8編碼string為bytes
轉自:http://www.runoob.com/python/python-2x-3x.html
https://www.cnblogs.com/R-bear/p/7744454.html