- Python 3 基礎教程(第2版)(慕課版)
- 劉凡馨 夏幫貴
- 979字
- 2020-04-14 15:01:18
1.1.4 Python 3與Python 2的區別

1.1.4 Python 3與Python 2的區別
Python 3與Python 2的主要區別如下。
1.Python 3中的文本使用Unicode編碼
Python 3中的字符默認使用Unicode編碼(UTF-8),其可以很好地支持中文或其他非英文字符,示例代碼如下。
>>> 長度=100 #漢字作為變量名
>>> print(長度)
100
在Python 3中,不需要使用“u”或“U”前綴表示Unicode字符,但二進制字符串必須使用“b”或“B”前綴。Python 2中不能使用漢字作為變量名,否則會出錯,示例代碼如下。
>>> 速度=100
File "<stdin>", line 1
速度=100
^
SyntaxError: invalid syntax
2.print()函數代替了print語句
Python 3使用print()函數來輸出數據,示例代碼如下。
>>> x=100
>>> print(10,'abc',x)
10 abc 100
Python 2使用print語句輸出數據,示例代碼如下。
>>> x=100
>>> print 10,'abc',x
10 abc 100
>>> print(10,'abc',x) #print語句將(10,'abc',x)作為一個元組輸出
(10, 'abc', 100)
3.完全的面向對象
Python 2中的各種數據類型,在Python 3中全面升級為類(class)。例如,在Python 2中測試數據類型結果如下。
>>> int,float,str
(<type 'int'>, <type 'float'>, <type 'str'>)
在Python 3中測試數據類型結果如下。
>>> int,float,str
(<class 'int'>, <class 'float'>, <class 'str'>)
4.部分方法和函數用視圖和迭代器代替了列表
下面的方法或函數在Python 2中返回列表,在Python 3中則返回視圖或迭代器。
● 字典的keys()、items()和values()方法用返回視圖代替了列表。不再支持Python 2中的iterkeys()、iteritems()和itervalues()。
● map()、filter()和zip()函數用返回迭代器代替了列表。
5.比較運算中的改變
比較運算的主要改變如下。
● 用“!=”代替了“<>”。
● 比較運算“<”“<=”“>=”和“>”在無法比較兩個數據大小時,會產生TypeError異常。
● 在Python 2中,“1 < ''”“0 > None”“len <= len”等運算返回True,而在Python 3中則會產生TypeError異常。
● 在判斷運算“==”和“!=”中,類型不兼容的數據視為不相等。
6.整數類型的改變
整數類型的主要改變如下。
● 不再有長整數(long)的概念,整數類型只有int一種。
● 在Python 3中,除法運算“/”返回浮點數(float),除法運算“//”只保留整數部分。Python 2在兩個整數的除法運算“/”中返回整數(截斷了小數部分)。
● 整數不再限制大小,刪除了sys模塊中的maxint(最大整數)常量。
● 不再支持以數字0開頭的八進制常量(如012),而改為用前綴“0o”表示(如0o12)。
7.字符串的改變
在Python 2中,字符串中的字符默認為單字節,字符串的類型有str和unicode兩種。帶前綴“u”或“U”的Unicode字符串的類型為unicode(注意首字母小寫),其他字符串(包含帶前綴“b”“B”“r”或“R”的字符串)為str類型。
在Python 3中,字符默認為Unicode字符,即雙字節字符。字符串的數據類型分為str和bytes兩種。仍可使用字符串前綴“u”或“U”,但會被忽略。字符串前綴“b”或“B”表示二進制字符串,其類型為bytes。
8.取消了file數據類型
Python3取消了Python2中的file數據類型。使用open()函數打開文件時,返回的是_io.TextIOWrapper類的實例對象,示例代碼如下。
>>> f=open('d:/test.txt','w')
>>> type(f)
<class '_io.TextIOWrapper'>
Python 2的open()函數返回的是file類型的對象,示例代碼如下。
>>> f=open('d:/test.txt','w')
>>> type(f)
<type 'file'>
9.異常處理的改變
在Python 3中,異常處理的改變主要如下。
● BaseException是所有異常類的基類,刪除了StardardError異常。
● 取消了異常類的序列行為和message屬性。
● 用raise Exception(args)代替raise Exception,args語法。
● 在捕獲異常的except語句中引入了as關鍵字。
在Python 2中,用下面的代碼捕捉和處理異常。
>>> try:
... raise TypeError,’類型錯誤’
...except TypeError,err:
... print err.message
...
類型錯誤
在Python 3中,用下面的代碼捕捉和處理異常。
>>> try:
... raise TypeError(’類型錯誤’)
...except TypeError as err:
... print(err)
...
類型錯誤
10.其他主要的語法改變
其他主要的語法改變如下。
● 增加了關鍵字as和with。
● 增加了常量True、False、None。
● 加入nonlocal語句。使用noclocal x聲明x為函數外部的變量。
● 刪除了raw_input(),代之以input()。
● 刪除了元組參數解包。不能用類似def(a, (b, c)):pass的語句定義函數。
● 增加了二進制字面量,如“b'0110110110'”。bin()函數可返回整數的二進制字符串。
● 擴展的可迭代解包。在Python 3中,“a, b, *x = '1234'”和“*x, a = '1234'”都是合法的。
● 對象和序列是可迭代的。
● 面向對象引入了抽象基類。
● 類的迭代器方法next()改名為__next__(),并增加內置函數next(),用以調用迭代器的__next__()方法。