Python?2與Python?3的部分區(qū)別

轉載自:http://segmentfault.com/a/1190000000328484兜辞, 有刪節(jié)

姓名:梅金波? ? ? ? ? ? ? ? ? ? ? 學號:16010110036

【嵌牛導讀】Python3是一個不向后兼容的版本,與Python 2之間有了很多的改變。所以,了解二者之間的差異,對于Python開發(fā)者來說是非常重要的。

【嵌牛鼻子】python3與python2的區(qū)別

【嵌牛提問】python3相比于python2有了哪些改變?

【嵌牛正文】下面簡單介紹Python 3相對于Python2的一些變化竹海。

Print

在Python3中print是個函數(shù),這意味著在使用的時候必須帶上小括號,并且它是帶有參數(shù)的丐黄。

old: print "The answer is", 2+2

new: print("The answer is", 2+2)?

old: print x,? ? ? # 末尾加上逗號阻止換行?

new: print(x, end="") # 使用空格來代替新的一行?

old: print >>sys.staerr, "fatal error"?

new: print ("fatal error", file=sys.stderr)?

old: print (x, y)? # 打印出元組(x, y)

new: print((x, y))? # 同上,在python3中print(x, y)的結果是跟這不同的

在Python3中還可以定義分隔符斋配,使用參數(shù)sep來指定。

print("There are <", 2+5, ">possibilities", sep="")

上面代碼的結果如下:

There are <7> possibilities

注意:

print()函數(shù)不支持Python2.X中print中的“軟空格”灌闺。在Python2.X中,print "A\n", "B"的結果是"A\nB\n";而在Python3中print("A\n", "B")的結果是"A\n B\n"艰争。

在剛開始使用Python3的時候,你會發(fā)現(xiàn)你經常在交互模式下你還是經常使用老式的語法print x,是時候鍛煉你的手指用print(x)來取代它啦。

如果你的項目比較大,而又想升級到Python3的時候,不用擔心,2to3這個工具會將所有的print語句轉換為print()函數(shù)桂对。

字典

dict的方法dict.keys(),dict.items(),dict.values()不會再返回列表,而是返回一個易讀的“views”甩卓。這樣一來,像這樣的語法將不再有用了:k = d.keys();k.sort()蕉斜,你可以使用k = sorted(d)來代替逾柿。

sorted(d)在Python2.5及以后的版本中也有用,但是Python3效率更高了宅此。

d = {'a': 1}d.keys()? ?

# dict_keys(['a'])?

d.items()? ?

# dict_items([('a', 1)])?

d.values()? # dict_values([1])?

k = d.keys()

k.sort()? ?

# AttributeError: 'dict_keys' object has no attribute 'sort'

同樣机错,dict.iterkeys(),dict.iteritems(),dict.itervalues()方法也不再支持。

map()和filter()將返回iterators父腕。如果你真的想要得到列表,list(map(...))是一個快速的方法弱匪,但是更好的方法是使用列表推導(尤其是原代碼使用了lambda表達式的時候),或者重寫原來的代碼璧亮,改為不需要使用列表萧诫。特別是map()會給函數(shù)帶來副作用,正確的方法是改為使用for循環(huán)枝嘶,因為創(chuàng)建一個列表是非常浪費的事情帘饶。

Python3中的range()函數(shù)跟Python2.X的xrange()函數(shù)的作用是一樣的,這樣可以使用任意的數(shù)字躬络,Python3中去除了xrange()函數(shù)尖奔。

zip()在Python3中返回的是一個迭代器搭儒。

比較符

Python3簡化了比較符穷当。

在使用比較符(<,<=淹禾,>=馁菜,>)時,當相比較的操作數(shù)的排序是沒有意義的時候將會拋出TypeError異常铃岔,因此像1 < ''汪疮,0 > None峭火,len <= len這樣的語句不再合法了。None < None也會拋出TypeError異常智嚷,而不是返回False卖丸。

你應該明白了,胡亂的比較是沒有意義的盏道,相比較的元素必須是能夠比較的才行稍浆。需要注意的是,==和!=不包括在內猜嘱,因為不同類型的衅枫,無法比較元素總是不等于另一個的。

builtin.sorted和list.sort()不再有提供比較函數(shù)的cmp參數(shù)朗伶,只有參數(shù)key和reverse弦撩。

cmp()函數(shù)應該當做被去除了,__cmp__()特殊方法也不再支持论皆。在需要的時候使用__lt__益楼,__eg__和__hash__。

整型數(shù)

從本質上來說点晴,long重命名了int偏形,因為在內置只有一個名為int的整型,但它基本跟之前的long一樣觉鼻。

像1/2這樣的語句將返回float俊扭,即0.5。使用1//2來獲取整型,這也是之前版本所謂的“地板除”坠陈。

移除了sys.maxint,因為整型數(shù)已經沒了限制萨惑。sys.maxsize可以用來當做一個比任何列表和字符串下標都要大的整型數(shù)。

repr()中比較大的整型數(shù)將不再帶有L后綴仇矾。

八進制數(shù)的字面量使用0o720代替了0720庸蔼。

Unicode Vs. 8-bit

Python3中改變了二進制數(shù)據和Unicode字符串。

Python3使用文本和(二進制)數(shù)據的理念代替之前的Unicode字符串和8-bit字符串贮匕,所有的文本默認是Unicode編碼姐仅。使用str類型保存文本,使用bytes類型保存數(shù)據刻盐。當你混淆文本和數(shù)據的時候Python3會拋出TypeError的錯誤掏膏。

不能再使用u"..."字面量表示unicode文本,而必須使用b"..."字面量表示二進制數(shù)據敦锌。

因為str和bytes不能弄混馒疹,所以你必須顯式地將他們進行轉換。使用str.encode()將str轉換為bytes乙墙,使用bytes.decode()將bytes轉換為str颖变,也可以使用bytes(s生均, encoding=...)和str(b, encoding=...)腥刹。

str和bytes都是不可變的類型马胧,有一個分離的可變類型的bytearray可以保存緩存的二進制數(shù)據,所有能夠接受bytes的API都能夠使用bytearray衔峰。這些可變的API是基于collections.MutableSequence的漓雅。

移除了抽象類型basestring,使用str代替朽色。

文件默認使用文本類型打開邻吞,這也是open()函數(shù)默認的。如果要打開二進制文件必須使用b參數(shù)葫男,否則會出現(xiàn)錯誤抱冷,而不會默默地提供錯誤的數(shù)據。

文件名都使用unicode字符串傳入和輸出梢褐。

一些關于系統(tǒng)的API旺遮,如os.environ和sys.argv,當系統(tǒng)允許bytes并且不能正常轉換為unicode的話盈咳,也會出現(xiàn)問題耿眉。所以,將系統(tǒng)的LANG設置好是最好的做法鱼响。

repr()函數(shù)不再轉義非ASCII字符鸣剪。

代碼默認為UTF-8編碼。

移除了StringIO和cStringIO丈积。加入了io模塊筐骇,并分別使用io.StringIO和io.BytesIO分別用于text和data。

新增語法

nonlocal聲明江滨。使用nonlocal x可以直接引用一個外部作用域的變量,但不是全局變量铛纬。

擴展了迭代的解包。

(a, *rest, b) = range(5)?

a? # 0

rest # [1,2,3]

b? # 4

字典推導唬滑。{k: v for k, v in stuff }告唆。

t = ((1,1), (2,2))?

d = {k: v for k, v in t}?

d? # {1: 1, 2: 2}

集合推導。{x for x in stuff}晶密,與set(stuff)效果一樣,但是更加靈活擒悬。

二進制字面量0b1010,相當于新的內置函數(shù)bin()惹挟。

字節(jié)字面量b或者B茄螃,相當于新的內置函數(shù)bytes()缝驳。

改變的語法

將except exc, var改為except exc as var连锯。

新的元類語法归苍。

# old?

class C:?

? __metaclass__ = M? ?

? ....?

# new?

class C(metaclass=M):?

? ? ....

列表推導不再支持[... for var in item1, item2, ...],必須寫成[... for var in (item1, item2,...)]运怖。

省略號...作為連續(xù)表達式可以用于任何地方,之前只能用于分片中拼弃。但是必須連續(xù)寫,之前帶空格的. . .不再支持。

移除的語法

移除了元組的解包摇展。不能再寫def foo(a, (b, c)): ....,需要寫成def foo(a, b_c):b, c = b_c吻氧。

移除<>,使用!=代替。

exec()不能再作為關鍵詞,只能作為一個函數(shù)咏连。并且exec()不再支持流變量,如exec(f)需寫成exec(f.read())盯孙。

整型不支持l/L后綴。

字符串不支持'u/U'前綴祟滴。

from module import *只能用在模塊級,在函數(shù)中不可使用振惰。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市垄懂,隨后出現(xiàn)的幾起案子骑晶,更是在濱河造成了極大的恐慌,老刑警劉巖草慧,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桶蛔,死亡現(xiàn)場離奇詭異,居然都是意外死亡漫谷,警方通過查閱死者的電腦和手機仔雷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舔示,“玉大人朽寞,你說我怎么就攤上這事≌独桑” “怎么了脑融?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長缩宜。 經常有香客問我肘迎,道長,這世上最難降的妖魔是什么锻煌? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任妓布,我火速辦了婚禮,結果婚禮上宋梧,老公的妹妹穿的比我還像新娘匣沼。我一直安慰自己,他們只是感情好捂龄,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布释涛。 她就那樣靜靜地躺著加叁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪唇撬。 梳的紋絲不亂的頭發(fā)上它匕,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音窖认,去河邊找鬼豫柬。 笑死,一個胖子當著我的面吹牛扑浸,可吹牛的內容都是我干的烧给。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼喝噪,長吁一口氣:“原來是場噩夢啊……” “哼创夜!你這毒婦竟也來了?” 一聲冷哼從身側響起仙逻,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤驰吓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后系奉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體檬贰,經...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年缺亮,在試婚紗的時候發(fā)現(xiàn)自己被綠了翁涤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡萌踱,死狀恐怖葵礼,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情并鸵,我是刑警寧澤鸳粉,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站园担,受9級特大地震影響届谈,放射性物質發(fā)生泄漏。R本人自食惡果不足惜弯汰,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一艰山、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧咏闪,春花似錦曙搬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽征讲。三九已至,卻和暖如春搂擦,著一層夾襖步出監(jiān)牢的瞬間稳诚,已是汗流浹背哗脖。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工瀑踢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人才避。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓橱夭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親桑逝。 傳聞我的和親對象是個殘疾皇子棘劣,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內容