Common Stumbling Blockspython
本段簡單的列出容易令人出錯的變更。linux
- print語句被print()函數取代了,可使用關鍵字參數來替代老的print特殊語法。例如:
- Old: print "The answer is", 2*2
- New: print("The answer is", 2*2)
- Old: print x, # 使用逗號結尾禁止換行
- New: print(x, end=" ") # 使用空格代替換行
- Old: print # 輸出新行
- New: print() # 輸出新行
- Old: print >>sys.stderr, "fatal error"
- New: print("fatal error", file=sys.stderr)
- Old: print (x, y) # 輸出repr((x, y))
- New: print((x, y)) # 不一樣於print(x, y)!
你能夠自定義輸出項之間的分隔符:
print("There are <", 2**32, "> possibilities!", sep="")
輸出結果是:
There are <4294967296> possibilities!
注意:
- print()函數不支持老print語句的「軟空格」特性,例如,在python2.x中,print "A\n", "B"會輸出"A\nB\n",而python3.0中,print("A\n", "B")會輸出"A\n B\n"
- 學會漸漸習慣print()吧!
- 使用2to3源碼轉換工具時,全部的print語句被自動轉換成print()函數調用,對大項目,這是無需爭論的。
- python3.0使用字符串(strings)和bytes代替Unicode字符串和8位字符串,這意味着幾乎全部使用Unicode編碼和二進制數據的代碼都要改動。這個改動很不錯,在2.x的世界裏,無數的bug都是由於編碼問題。
- map()和filter()返回迭代器(iterators)
- dict方法keys(),items(),values()返回視圖(一樣是迭代器)而不是列表(list)
- 內建的sorted()方法和list.sort()方法再也不接受表示比較函數的cmp參數,使用key參數代替。
- 1/2返回浮點數,使用1//2能獲得整數。
- repr()函數對於long整數再也不包含拖尾的L,因此不加判斷的去除最後一個字符會致使去掉一個有用的數字
String and Byteswindows
- 如今只有一種字符串:str,它的行爲和實現都很像2.x的unicode串。
- basestring超類已經去掉了,2to3工具會把每一個出現的basestring替換成str。
- PEP3137:新類型bytes,用來表示二進制數據和編碼文本,str和bytes不能混合,須要時,必須進行顯示的轉換,轉換方法是str.encode()(str->bytes)和bytes.decode()(bytes->str).
- 在原始字符串(raw strings)中全部反斜線都按字面量解釋,再也不特殊處理Unicode轉義字符。
- PEP3112:bytes字面量,例如b"abc",建立bytes實例。
- PEP3120:默認源文件編碼爲UTF-8
- PEP3131:可使用非ASCII標識符(然而,除了註釋中貢獻者的名字以外,標準庫仍然只包含ASCII)
- PEP3116:新的IO實現,API幾乎100%向後兼容,二進制文件使用bytes代替strings
- 去除了StringIO和cStringIO模塊,取而代之的是io.StringIO或者io.BytesIO
PEP3101:字符串格式化的新方法app
- str.format方法(原文提到替代了%操做符,實際上,format方法和%的用法差異很大,各有所長)。
PEP3106:修補了dict的keys(),items(),values()方法ide
- 刪除了dict.iterkeys(),dict.itervalues()和dict.iteritems()
- dict.keys(),dict.values()和dict.items()返回dict相關數據的引用
PEP3107:函數註解(Function Annotations)函數
Exception Stuff工具
- PEP352:異常類必須繼承自BaseException,它異常結構的基類。
- 移除了StandardError
- Dropping sequence behavior (slicing!) and message attribute of exception instances.
- PEP3109:拋出異常:如今必須使用raise Exception(args)而不是原來的raise Exception, args
- PEP3110:捕獲異常,如今必須使用except Exception as identifier而不是原來的except Exception, identifier
- PEP3134:異常鏈(Exception chain)。
- 改良了一些windows不能加載模式時的異常信息,具備本地化處理。
New Class and Metaclass Stuff測試
- 移除了classic class
- PEP3115:新的metaclass語法
- PEP3119:抽象基類。
- PEP3129:類包裝。
- PEP3141:數字抽象基類
其餘的語言變化ui
這裏列出大多數的python語言核心和內建函數的變化。編碼
- 移除了backticks(使用repr()代替)
- 移除了<>(不等號,使用!=代替)
- as和with變成了關鍵字
- True,False和None變成了關鍵字
- PEP237:long不存在了,只有int,它和原來的long同樣。再也不支持以L結尾的數字字面量。移除sys.maxint,由於int如今已是無限大了
- PEP238:int相除,返回float
- 改變了順序操做符的行爲,例如x<y,當x和y類型不匹配時拋出TypeError而不是返回隨即的bool值
- 移除了__getslice__,語法a[i:j]被解釋成a.__getitem__(slice(i,j))
- PEP3102:keyword-only arguments.在函數參數列表中,出如今*args以後的命名參數只能使用"關鍵字參數"的形式調用
- PEP3104:nonlocal聲明。使用nonlocal能夠聲明一個外部變量(不是global變量)
- PEP3111:raw_input()更名爲input(),也就是說,新的input()函數從標準輸入設備(sys.stdin)讀取一行並返回(不包括行結束符),若是輸入過早終止,該函數拋出EOFError,若是想使用老的input(),可使用eval(input())代替。
- xrange()更名爲range(),range()如今不是產生一個列表(list),而是一個迭代器。
- PEP3113:移除了"元組參數拆包(tuple parameter unpacking)"。這種寫法已經不行了:
def foo(a, (b, c)):...
如今要這樣寫:
def foo(a, b_c):
b,c = b_c
- PEP3114:next()重命名爲__next__(),新的內建函數next()能夠調用一個對象的__next__()方法。
- PEP3127:新的八進制字面量,二進制字面量和bin()函數。你應該寫0o666而不是0666,oct()函數也作了響應的改動。一樣,0b1010等價於10,bin(10)返回"0b1010"。0666這種寫法如今是錯誤的。
- PEP3132:支持迭代器拆包。如今你能夠這樣寫:
a, b, *rest = some_seqence
甚至象這樣:
*rest, a = stuff
通常狀況下,rest對象是list,而等號右邊的對象是可迭代的
- PEP3135:新的super()。你能夠不適用任何參數調用super(),正確的參數和實例會被正確選擇。若是使用參數,它的行爲不變,和之前同樣。
- zip(),map(),filter()返回迭代器。
- 移除了string.letters和它的朋友們(string.lowcase和string.uppercase),如今上場的是string.ascii_letters等
- 移除了apply(),callable(),exefile(),file(),reduce(),reload()
- 移除了dict.has_key()。使用in操做符進行測試
- exec語句沒有了,如今是exec()函數
- 移除了__oct__()和__hex__()特殊方法。oct()和hex()方法使用__index__()
- 移除了對__members__和__methods__的支持
- nb_nonzero重命名爲nb_bool,__nonzero__()重命名爲__bool__()
Optimizations
- 通常狀況下,python 3.0比python 2.5慢33%左右。不過仍有提高空間。
模塊變更(新的,改進的和廢棄的)
- 移除了cPickle模塊,可使用pickle模塊代替。最終咱們將會有一個透明高效的模塊。
- 移除了p_w_picpathop模塊
- 移除了audiodev, Bastion, bsddb185, exceptions, linuxaudiodev, md5, MimeWriter, mimify, popen2, rexec, sets, sha, stringold, strop, sunaudiodev, timing和xmllib模塊
- 移除了bsddb模塊(單獨發佈,能夠從http://www.jcea.es/programacion/pybsddb.htm獲取)
- 移除了new模塊
- os.tmpnam()和os.tmpfile()函數被移動到tmpfile模塊下
- tokenize模塊如今使用bytes工做。主要的入口點再也不是generate_tokens,而是tokenize.tokenize()
Build and C API Changes
Python’s build process和C API的改動包括:
- PEP3118:新的Buffer API
- PEP3121:擴展模塊的的Initialization & Finalization
- PEP3123:使PyObject_HEAD符合標準C
其餘的改動和修復
在源碼裏分散一系列的改進和bug修復。changes log代表,從2.6到3.0,有XXX個改動和YYY的bug修復。