Python3和Python2的區(qū)別

1.性能

  • Py3.0運(yùn)行 pystone benchmark的速度比Py2.5慢30%田绑。
  • Guido認(rèn)為Py3.0有極大的優(yōu)化空間楞遏,在字符串和整形操作上可 以取得很好的優(yōu)化結(jié)果。
  • Py3.1性能比Py2.5慢15%扶镀,還有很大的提升空間。

2.編碼

  • Py3.X源碼文件默認(rèn)使用utf-8編碼,這就使得以下代碼是合法的:
 >>> 中國 = 'china'    
 >>>print(中國)     
 china  

3. 語法

    1. 去除了<>硬毕,全部改用!=
    1. 去除``,全部改用repr()
    1. 關(guān)鍵詞加入aswith礼仗,還有True,False,None
    1. 整型除法返回浮點(diǎn)數(shù)吐咳,要得到整型結(jié)果,請使用//
    1. 加入nonlocal語句元践。使用noclocal x可以直接指派外圍(非全局)變量
    1. 去除print語句韭脊,加入print()函數(shù)實(shí)現(xiàn)相同的功能。
      同樣的還有 exec語句单旁,已經(jīng)改為exec()函數(shù)
      例如:
2.X: print "The answer is", 2*2       
3.X: print("The answer is", 2*2)       
2.X: print x,                              # 使用逗號結(jié)尾禁止換行       
3.X: print(x, end=" ")                     # 使用空格代替換行 
2.X: print                                 # 輸出新行       
3.X: print()                               # 輸出新行       
2.X: print >>sys.stderr, "fatal error"       
3.X: print("fatal error", file=sys.stderr)    
2.X: print (x, y)                          # 輸出repr((x, y))       
3.X: print((x, y))                         # 不同于print(x, y)!  
    1. 改變了順序操作符的行為
      例如:
      x<y沪羔,當(dāng)x和y類型不匹配時拋出TypeError而不是返回隨即的 bool
    1. 輸入函數(shù)改變了,刪除了raw_input象浑,用input代替:
2.X:guess = int(raw_input('Enter an integer : ')) # 讀取鍵盤輸入的方法    
3.X:guess = int(input('Enter an integer : '))
    1. 去除元組參數(shù)解包蔫饰。
      不能def(a, (b, c)):pass這樣定義函數(shù)了
    1. 新式的8進(jìn)制字變量琅豆,相應(yīng)地修改了oct()函數(shù)。
      2.X的方式如下:
>>> 0666       
438      
>>> oct(438)      
'0666'     

???????????3.X這樣:

>>> 0666      
 SyntaxError: invalid token (<pyshell#63>, line 1)       
>>> 0o666       
438      
>>> oct(438)       
'0o666'  
    1. 增加了 2進(jìn)制字面量和bin()函數(shù)
>>> bin(438)     
'0b110110110'      
>>> _438 = '0b110110110'      
>>> _438      
'0b110110110'  
    1. 擴(kuò)展的可迭代解包篓吁。
      在Py3.X 里茫因,a, b, *rest = seq*rest, a = seq都是合法的,
      只要求兩點(diǎn):restlist 對象和seq是可迭代的杖剪。
    1. 新的super()冻押,可以不再給super()傳參數(shù),
>>> class C(object):            
    def __init__(self, a):              
        print('C', a)     
 >>> class D(C):            
    def __init(self, a):               
        super().__init__(a) # 無參數(shù)調(diào)用super()      
>>> D(8)     
C 8      
<__main__.D object at 0x00D7ED90>  
    1. 新的metaclass語法:
class Foo(*bases, **kwds):        
    pass  
    1. 支持class decorator摘盆。
      用法與函數(shù)decorator一樣:
>>> def foo(cls_a):            
    def print_func(self):               
        print('Hello, world!')            
    cls_a.print = print_func            
    return cls_a      
>>> @foo      
class C(object):        
    pass      
>>> C().print()      
Hello, world!  

class decorator可以用來玩玩貍貓換太子的把戲翼雀。


4. 字符串和字節(jié)串

    1. 現(xiàn)在字符串只有str一種類型,但它跟2.x版本的unicode幾乎一樣孩擂。
    1. 關(guān)于字節(jié)串狼渊,請參閱“數(shù)據(jù)類型”的第2條目

5.數(shù)據(jù)類型

    1. Py3.X去除了long類型,現(xiàn)在只有一種整型——int类垦,但它的行為就像2.X版本的long
    1. 新增了bytes類型狈邑,對應(yīng)于2.X版本的八位串,定義一個bytes字面量的方法如下:
>>> b = b'china'      
>>> type(b)      
<type 'bytes'>  

str對象和bytes對象可以使用.encode() (str -> bytes) or.decode() (bytes -> str)方法相互轉(zhuǎn)化蚤认。

>>> s = b.decode()      
>>> s      
'china'      
>>> b1 = s.encode()      
>>> b1      
b'china'  
    1. dict.keys()米苹、.items.values()方法返回迭代器,而之前的iterkeys()等函數(shù)都被廢棄砰琢。同時去掉的還有 dict.has_key()蘸嘶,用in替代它吧

6.面向?qū)ο?/strong>
1)引入抽象基類(Abstraact Base Classes,ABCs)陪汽。
2)容器類和迭代器類被ABCs化训唱,所以cellections模塊里的類型比Py2.5多了很多。

>>> import collections      
>>> print('\n'.join(dir(collections)))      
Callable      
Container      
Hashable      
ItemsView      
Iterable      
Iterator      
KeysView      
Mapping      
MappingView      
MutableMapping      
MutableSequence      
MutableSet      
NamedTuple      
Sequence      
Set      
Sized      
ValuesView     
 __all__      
__builtins__      
__doc__      
__file__      
__name__      
_abcoll     
 _itemgetter      
_sys      
defaultdict      
deque 

另外挚冤,數(shù)值類型也被ABCs化况增。

    1. 迭代器的next()方法改名為__next__(),并增加內(nèi)置函數(shù)next()训挡,用以調(diào)用迭代器的next()方法
    1. 增加了@abstractmethod@abstractproperty兩個 decorator澳骤,編寫抽象方法(屬性)更加方便。

7.異常

    1. 所以異常都從 BaseException繼承澜薄,并刪除了StardardError
    1. 去除了異常類的序列行為和.message屬性
    1. raise Exception(args)代替raise Exception, args語法
    1. 捕獲異常的語法改變为肮,
      引入了as關(guān)鍵字來標(biāo)識異常實(shí)例。

在Py2.5中:

>>> try:      
...    raise NotImplementedError('Error')      
... except NotImplementedError, error:
...    print error.message      
...      
Error  

在Py3.0中:

>>> try:            
    raise NotImplementedError('Error')          
  except NotImplementedError as error: #注意這個 as            
    print(str(error))      
Error  
    1. 異常鏈肤京,因?yàn)?code>__context__在3.0a1版本中沒有實(shí)現(xiàn)

8.模塊變動

    1. 移除了cPickle模塊弥锄,可以使用pickle模塊代替。最終我們將會有一個透明高效的模塊。
    1. 移除了imageop模塊
    1. 移除了 audiodev, Bastion, bsddb185,exceptions, linuxaudiodev, md5, MimeWriter, mimify, popen2, rexec, sets, sha, stringold, strop, sunaudiodev, timingxmllib模塊
  • 4.移除了bsddb模塊(單獨(dú)發(fā)布籽暇,可以從http://www.jcea.es/programacion/pybsddb.htm獲取)
  • 5.移除了new模塊
  • 6.os.tmpnam()os.tmpfile()函數(shù)被移動到tmpfile模塊下
    1. tokenize模塊現(xiàn)在使用bytes工作。主要的入口點(diǎn)不再是generate_tokens饭庞,而是 tokenize.tokenize()

9.其它

    1. xrange() 改名為range()戒悠,要想使用range()獲得一個list,必須顯式調(diào)用:
>>> list(range(10))     
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]  
    1. bytes對象不能hash舟山,也不支持 b.lower()绸狐、b.strip()b.split()方法,但對于后兩者可以使用 b.strip(b’ \n\t\r \f’)b.split(b’ ‘)來達(dá)到相同目的
    1. zip()累盗、map()filter()都返回迭代器寒矿。而apply()callable()若债、coerce()符相、 execfile()reduce()reload ()函數(shù)都被去除了
      現(xiàn)在可以使用hasattr()來替換 callable(). hasattr()的語法如:hasattr(string, '__name__')
    1. string.letters和相關(guān)的.lowercase.uppercase被去除蠢琳,請改用string.ascii_letters
    1. 如果x < y的不能比較啊终,拋出TypeError異常。2.x版本是返回偽隨機(jī)布爾值的
    1. __getslice__系列成員被廢棄傲须。a[i:j]根據(jù)上下文轉(zhuǎn)換為a.__getitem__(slice(I, j))__setitem____delitem__調(diào)用
    1. file類被廢棄

在Py2.5中:

>>> file      
<type 'file'>  

在Py3.X中:

 >>> file      
Traceback (most recent call last):      
File "<pyshell#120>", line 1, in <module>         
    file      
NameError: name 'file' is not defined
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蓝牲,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子泰讽,更是在濱河造成了極大的恐慌例衍,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件已卸,死亡現(xiàn)場離奇詭異佛玄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)咬最,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門蛀骇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人骇吭,你說我怎么就攤上這事候学。” “怎么了翅雏?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵圈驼,是天一觀的道長。 經(jīng)常有香客問我望几,道長绩脆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮靴迫,結(jié)果婚禮上惕味,老公的妹妹穿的比我還像新娘。我一直安慰自己玉锌,他們只是感情好名挥,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著主守,像睡著了一般禀倔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上参淫,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天救湖,我揣著相機(jī)與錄音,去河邊找鬼涎才。 笑死鞋既,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的憔维。 我是一名探鬼主播涛救,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼业扒!你這毒婦竟也來了检吆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤程储,失蹤者是張志新(化名)和其女友劉穎蹭沛,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體章鲤,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡摊灭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了败徊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帚呼。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖皱蹦,靈堂內(nèi)的尸體忽然破棺而出煤杀,到底是詐尸還是另有隱情,我是刑警寧澤沪哺,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布沈自,位于F島的核電站,受9級特大地震影響辜妓,放射性物質(zhì)發(fā)生泄漏枯途。R本人自食惡果不足惜忌怎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望酪夷。 院中可真熱鬧榴啸,春花似錦、人聲如沸晚岭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腥例。三九已至,卻和暖如春酝润,著一層夾襖步出監(jiān)牢的瞬間燎竖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工要销, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留构回,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓疏咐,卻偏偏與公主長得像纤掸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子浑塞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容