Python - 2和3的區別

 編碼:

  • Python2的默認編碼是ASCII碼,這是致使Python2中常常遇到編碼問題的主要緣由之一,至於緣由,在於Python這門語言出現的時候,尚未Unicode!
  • Python3默認編碼是Unicode,所以,沒必要再文件頂部寫# codeing=utf-8了。
# Python2:
import sys
>>>sys.getdefaultencoding()
'ascii'

# Python3:
import sys
>>>sys.getdefaultencoding()
'utf-8'
查看默認編碼

字符串:

  • Python2中,字符串有兩種類型,Unicode和str,前者表示文本字符串,後者表示字節序列,但在Python2中並無嚴格的界限,因此容易出錯。
  • Python3中,str表示字符串,byte表示字節序列,任何須要寫入文本或者網絡傳輸的數據都只接收字節序列,這就從源頭上阻止編碼錯誤的問題。 

True和False:

  • Python2中true和false是兩個全局變量,在數值上對應1和0
  • Python3則把true和false指定爲關鍵字,永遠指向兩個固定的對象,不能被從新賦值
# Python2:
>>> True = False
>>> True
False
>>> True = 1
>>> True
1
>>> False = 'x'
>>> False
'x'

# Python3:
>>> True = False
  File "<stdin>", line 1
SyntaxError: can't assign to keyword
>>> True = 1
  File "<stdin>", line 1
SyntaxError: can't assign to keyword

>>> import keyword
>>> keyword.iskeyword('True')
True
>>> keyword.kwlist
['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
True和False的區別

nonlocal:

  • Python2中沒法給嵌套函數中的變量聲明爲非局部變量,只能使用global關鍵字聲明某個變量爲全局變量
  • Python3中新增關鍵字nonlocal,能夠解決這一問題
a = 3
def func1():
    a = 1
    def foo():
        a = 2
    foo()
    print(a)  # 1
func1()
def func2():

    a = 1
    def foo():
        nonlocal a
        a = 2
    foo()
    print(a)  # 2
func2()
nonlocal

語法:

  • 去除了 <> ,所有使用 !=  # python2兩個均可以,python3則只能用 !=
  • 去除 '' ,新增repr()
  • 新增關鍵字:as,with,True,False,None
  • 整形除法返回浮點數,如想要獲得整形結果,使用 // 
  • 去除print語句,變爲print()函數實現相同功能,一樣的還有exec語句,改成exec()函數
  • 改變了順序操做符的行爲,例如,x > y,當x和y類型不一樣時則拋出TypeError,而不是返回bool值
  • 輸入函數由raw_input改成input
  • 去除元組參數解包,不能再def(a,(b,c)):pass這樣定義函數
  • 新的super(),能夠不用傳遞參數
#Python2
>>> 6 / 2
3
>>> 6 //2
3
>>> 1 <> 2
True
>>> 1 != 2
True
>>> 'a' < 1
False
>>> 'a' < 1
False
>>> 'a' > 1
True

#Python3
>>> 6 / 2
3.0
>>> 6 //2
3
>>> 1 <> 2
  File "<stdin>", line 1
    1 <> 2
       ^
SyntaxError: invalid syntax
>>> 1 != 2
True
>>> 'a' < 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'str' and 'int'
!=示例

 

異常:

  • 異常都繼承BaseException
  • 用 raise Exception(args)代替 raise Exception, args語法 
  • 捕獲異常的語法改變,引入了as關鍵字來標識異常實例

模塊:

  • 移除cPickle模塊,可使用pickle模塊代替
  • 移除imageop模塊
  • 移除bsddb模塊
  • 移除new模塊
  • os.tmpnam()和os.tmpfile()函數被移動到tmpfile模塊下
  • tokenize模塊如今使用bytes工做。主要的入口點再也不是generate_tokens,而是 tokenize.tokenize() 

其它:

  • xrange()改成range(),要想使用range()得到一個list,必須顯示調用:list(range(100))
  • bytes對象不能hash,也不支持 b.lower()、b.strip()和b.split()方法,但對於後二者可使用 b.strip(b’  
    \n\t\r \f’)和b.split(b’ ‘)來達到相同目的 
  • zip()、map()和filter()都返回迭代器。而apply()、 callable()、coerce()、 execfile()、reduce()和reload 
    ()函數都被去除了
  • Python3中file類被廢棄
#Python2
>>> file
<type 'file'>

# Python3
>>> file
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'file' is not defined
file示例

 


摘自:html

 


Endpython

相關文章
相關標籤/搜索