一.性能
python3.x的性能低于Python2.x,但是python3.x有極大的優(yōu)化空間精偿,正在追趕.
二.基本語(yǔ)法差異
一).核心語(yǔ)法差異
1.Python3對(duì)Unicode字符的原生支持
Python2中使用 ASCII 碼作為默認(rèn)編碼方式導(dǎo)致string有兩種類型str和unicode,Python3只支持unicode的string锻霎。python2和python3字節(jié)和字符對(duì)應(yīng)關(guān)系為:
2.Python3采用的是絕對(duì)路徑的方式進(jìn)行import蹈矮。
Python2中相對(duì)路徑的import會(huì)導(dǎo)致標(biāo)準(zhǔn)庫(kù)導(dǎo)入變得困難(想象一下,同一目錄下有file.py畜眨,如何同時(shí)導(dǎo)入這個(gè)文件和標(biāo)準(zhǔn)庫(kù)file)昼牛。Python3中這一點(diǎn)將被修改,如果還需要導(dǎo)入同一目錄的文件必須使用絕對(duì)路徑康聂,否則只能使用相關(guān)導(dǎo)入的方式來(lái)進(jìn)行導(dǎo)入贰健。
3.Python2中存在老式類和新式類的區(qū)別,Python3統(tǒng)一采用新式類恬汁。新式類聲明要求繼承object伶椿,必須用新式類應(yīng)用多重繼承。
4.Python3使用更加嚴(yán)格的縮進(jìn)氓侧。Python2的縮進(jìn)機(jī)制中脊另,1個(gè)tab和8個(gè)space是等價(jià)的,所以在縮進(jìn)中可以同時(shí)允許tab和space在代碼中共存约巷。
這種等價(jià)機(jī)制會(huì)導(dǎo)致部分IDE使用存在問(wèn)題偎痛。Python3中1個(gè)tab只能找另外一個(gè)tab替代,因此tab和space共存會(huì)導(dǎo)致報(bào)錯(cuò):TabError: inconsistent use of tabs and spaces in indentation.
二).廢棄類差異
1.print語(yǔ)句被python3廢棄独郎,統(tǒng)一使用print函數(shù)
2.exec語(yǔ)句被python3廢棄踩麦,統(tǒng)一使用exec函數(shù)
3.execfile語(yǔ)句被Python3廢棄,推薦使用exec(open("./filename").read())
4.不相等操作符"<>"被Python3廢棄氓癌,統(tǒng)一使用"!="
5.long整數(shù)類型被Python3廢棄谓谦,統(tǒng)一使用int
6.xrange函數(shù)被Python3廢棄,統(tǒng)一使用range顽铸,Python3中range的機(jī)制也進(jìn)行修改并提高了大數(shù)據(jù)集生成效率
7.Python3中這些方法再不再返回list對(duì)象:dictionary關(guān)聯(lián)的keys()茁计、values()、items()谓松,zip()星压,map(),filter()鬼譬,但是可以通過(guò)list強(qiáng)行轉(zhuǎn)換:
mydict={"a":1,"b":2,"c":3}
mydict.keys() #<built-in method keys of dict object at 0x000000000040B4C8>
list(mydict.keys()) #['a', 'c', 'b']
8.迭代器iterator的next()函數(shù)被Python3廢棄娜膘,統(tǒng)一使用next(iterator)
9.raw_input函數(shù)被Python3廢棄,統(tǒng)一使用input函數(shù)
10.字典變量的has_key函數(shù)被Python廢棄优质,統(tǒng)一使用in關(guān)鍵詞
11.file函數(shù)被Python3廢棄竣贪,統(tǒng)一使用open來(lái)處理文件军洼,可以通過(guò)io.IOBase檢查文件類型
12.apply函數(shù)被Python3廢棄
13.異常StandardError 被Python3廢棄,統(tǒng)一使用Exception
三).修改類差異
1.浮點(diǎn)數(shù)除法操作符/和//區(qū)別
- Python2:/是整數(shù)除法演怎,//是小數(shù)除法
運(yùn)行 "5/3"得出結(jié)果為1, 如果想得出小數(shù)部分, 則需要把代碼改成:"float(5)/float(3)", 即加上類型. - Python3:/是小數(shù)除法匕争,//是整數(shù)除法。
運(yùn)行"5/3"得出結(jié)果為1.666666, 如果只得到整數(shù)部分,則需要修改代碼為:"5//3", 即使用整除.
2.異常拋出和捕捉機(jī)制區(qū)別
所有異常都從BaseException繼承, 并且刪除了StandardError
- Python2
try:
...
except Exception, e:
raise IOError, "file error" #拋出異常
except NameError, err: #捕捉異常
- Python3
try:
...
except Exception as e:
raise IOError("file error") #拋出異常
except NameError as err: #捕捉異常
3.for循環(huán)中變量值區(qū)別
- Python2爷耀,for循環(huán)會(huì)修改外部相同名稱變量的值
i = 1
print ('comprehension: ', [i for i in range(5)])
print ('after: i =', i ) #i=4
- Python3甘桑,for循環(huán)不會(huì)修改外部相同名稱變量的值
i = 1
print ('comprehension: ', [i for i in range(5)])
print ('after: i =', i ) #i=1
4.round函數(shù)返回值區(qū)別
- Python2,round函數(shù)返回float類型值
isinstance(round(15.5),int) #True
- Python3中只有同一數(shù)據(jù)類型的對(duì)象可以比較
isinstance(round(15.5),float) #True
5.比較操作符區(qū)別
- Python2中任意兩個(gè)對(duì)象都可以比較
11 < 'test' #True
- Python3中只有同一數(shù)據(jù)類型的對(duì)象可以比較
11 < 'test' # TypeError: unorderable types: int() < str()
6.map歹叮、filter 和 reduce的差異
- 這三個(gè)函數(shù)號(hào)稱是函數(shù)式編程的代表跑杭。在 Python3.x 和 Python2.x 中也有了很大的差異。
首先我們先簡(jiǎn)單的在 Python2.x 的交互下輸入 map 和 filter,看到它們兩者的類型是 built-in function(內(nèi)置函數(shù)):
>>> map
<built-in function map>
>>> filter
<built-in function filter>
>>>
它們輸出的結(jié)果類型都是列表:
>>> map(lambda x:x *2, [1,2,3])
[2, 4, 6]
>>> filter(lambda x:x %2 ==0,range(10))
[0, 2, 4, 6, 8]
>>>
但是在Python 3.x中它們卻不是這個(gè)樣子了:
>>> map
<class 'map'>
>>> map(print,[1,2,3])
<map object at 0x10d8bd400>
>>> filter
<class 'filter'>
>>> filter(lambda x:x % 2 == 0, range(10))
<filter object at 0x10d8bd3c8>
>>>
首先它們從函數(shù)變成了類咆耿,其次德谅,它們的返回結(jié)果也從當(dāng)初的列表成了一個(gè)可迭代的對(duì)象, 我們嘗試用 next 函數(shù)來(lái)進(jìn)行手工迭代:
>>> f =filter(lambda x:x %2 ==0, range(10))
>>> next(f)
0
>>> next(f)
2
>>> next(f)
4
>>> next(f)
6
>>>
對(duì)于比較高端的 reduce 函數(shù),它在 Python 3.x 中已經(jīng)不屬于 built-in 了萨螺,被挪到 functools 模塊當(dāng)中窄做。
7.打開(kāi)文件
- python2中
file( ..... )
或
open(.....)
- Python3中
加入了"as"和"with"關(guān)鍵字, 用于打開(kāi)文件
open with(.....) as :
8.chr( K ) 與 ord( c )
- python 2
chr( K ) 將編碼K 轉(zhuǎn)為字符,K的范圍是 0 ~ 255
ord( c ) 取單個(gè)字符的編碼, 返回值的范圍: 0 ~ 255 - python 3
chr( K ) 將編碼K 轉(zhuǎn)為字符屑迂,K的范圍是 0 ~ 65535
ord( c ) 取單個(gè)字符的編碼, 返回值的范圍: 0 ~ 65535
四).新增類差異
- python3.x中加入了nonlocal語(yǔ)句
python引用變量的順序- 1.當(dāng)前作用域局部變量
- 2.外層作用域變量
- 3.當(dāng)前模塊中的全局變量
- python內(nèi)置變量
與global相似
- python內(nèi)置變量
nonlocal關(guān)鍵字用來(lái)在函數(shù)或其他作用域中使用外層(非全局)變量
示例1
def sub():
n = 100 # 局部變量
print(n)
def sub2():
nonlocal n # 非本地的(非全局的)外部變量
n -= 10
print(n)
return sub2
s = sub()
s()
s()
輸出:
100
90
80
示例2
def main():
def local_n():
n = 200
def nonlocal_n():
nonlocal n
n = 300
def global_n():
global n # 聲明為全局變量
n = 400
n = 10
local_n()
print(n)
nonlocal_n()
print(n)
global_n()
print('global_n() After:{0}'.format(n)) # 顯示的局部變量
main()
print('n = {0}'.format(n))
--------------------------------------------------------
10
300
global_n() After:300
n = 400
2.dict字典變動(dòng)
python3.x 去除了dict.iterkeys(),dict.itervalues(),dict.iteritems(), dict.has_key()方法
新增: dict.keys(),dict.values(),dict.items()
3.面向?qū)ο?br>
引入抽象基類(Abstraact Base Classes浸策,ABCs)
import abc
@abc.abstractmethod
4.模塊變動(dòng)
舊的名字 | 新的名字 |
---|---|
_winreg | winreg |
COngigParser | configpaeser |
copy_reg | copyreg |
Queue | queue |
SocketServer | sockerserver |
repr | reprlib |