學習了一段時間的python,經常在python3.5上實戰一些python2.x編寫的代碼,導緻各種報錯,然後各種尋找錯誤解決方法。經過幾次錯誤(1. python3中print為一個函數,必須用括号()括起來 2.輸入問題上python3用input,python2用raw_input 3.python3-range()而python2-xrange() 4. import sys reload(sys)報錯,python3不存在reload)點醒,終于覺得應該将Python2.x與Python3.x版本差別整理出來,避免以後再在版本差異導緻編譯錯誤問題上花費大量的時間和經曆,并以此分享給學習python的小夥伴們。
1. 原來python2中1/2(兩個整數相除)結果是0,現在python3.5是0.5了,整型除法/傳回浮點數,要得到整型結果,則使用//取整;
2. python3.5增加了對 bytes 和 原生 unicode字元串的支援, 删除了 unicode 對象, str 為原生 unicode 字元串, bytes 替代了之前的 str 這個是最核心的;
3.python2 預設編碼是asscii(8-bit 字元串),python3預設采用utf-8(16-bit Unicode 字元串存儲)作為預設編碼,是以不需要在檔案頂部寫#coding=utf-8了;
(一)字元串編碼(encode) 為 bytes
例: s = "張三abc12"
b = s.encode( 編碼方式)# b 就是 bytes 類型的資料
# 常用的編碼方式為 : "uft-16" , "utf-8", "gbk", "gb2312", "ascii" , "latin1" 等
# 注 : 當字元串不能編碼為指定的“編碼方式”時,會引發異常
(二) bytes 解碼(decode)為字元串
s = "張三abc12"
b = s.encode( "gbk") # 字元串 s 編碼為 gbk 格式的位元組序列
s1 = b.decode("gbk") # 将位元組序列 b以gbk格式 解碼為字元串
# 說明,當位元組序列不能以指定的編碼格式解碼時會引發異常
(三) chr( K ) 與 ord( c )
chr( K ) 将編碼K 轉為字元,K的範圍是 0 ~ 65535
ord( c ) 取單個字元的編碼, 傳回值的範圍: 0 ~ 65535
4.關鍵詞加入as 和with,還有True,False,None;
5.去除print語句,加入print()函數實作相同的功能。同樣的還有 exec語句,已經改為exec()函數;
6.輸入函數改變了,删除了raw_input,用input代替;
7.xrange() 改名為range(),要想使用range()獲得一個list,必須顯式調用: >>> list(range(10))
8. bytes對象不能hash,也不支援 b.lower()、b.strip()和b.split()方法,但對于後兩者可以使用 b.strip(b’
\n\t\r \f’)和b.split(b’ ‘)來達到相同目的;
9.zip()、map()和filter()都傳回疊代器。而apply()、 callable()、coerce()、 execfile()、reduce()和reload()函數都被去除了;現在可以使用hasattr()來替換 callable(). hasattr()的文法如:hasattr(string, '__name__')
10.string.letters和相關的.lowercase和.uppercase被去除,改用string.ascii_letters 等 ;
11.如果x < y的不能比較,抛出TypeError異常。2.x版本是傳回僞随機布爾值的 ;
12.__getslice__系列成員被廢棄。a[i:j]根據上下文轉換為a.__getitem__(slice(I, j))或 __setitem__和 __delitem__調用
13.file類被廢棄,在python3.5中NameError: name 'file' is not defined。打開檔案隻能用open(...)
14.python3.5去除了long類型,現在隻有一種整型——int,但它的行為就像2.X版本的long;
15.python3.5,新增了bytes類型,str對象和bytes對象可以使用.encode() (str -> bytes) or .decode() (bytes -> str)方法互相轉化;
16.dict的.keys()、.items 和.values()方法傳回疊代器,而之前的iterkeys()等函數都被廢棄。同時去掉的還有dict.has_key(),用 in替代它;
17.python3.5是以異常都從 BaseException繼承,并删除了StardardError;
18.python3.5去除了異常類的序列行為和.message屬性 ;
19.python3.5用 raise Exception(args)代替 raise Exception, args文法;
20.python3.5捕獲異常的文法改變,引入了as關鍵字來辨別異常執行個體,try:...except Exception as e:替代try:...except Exception,e;
21.移除了cPickle子產品,可以使用pickle子產品代替。移除了imageop子產品,移除了audiodev, Bastion, bsddb185, exceptions, linuxaudiodev, md5, MimeWriter, mimify, popen2, rexec, sets, sha, stringold, strop, sunaudiodev, timing和xmllib子產品,移除了new子產品;
22.os.tmpnam()和os.tmpfile()函數被移動到tmpfile子產品下;tokenize子產品現在使用bytes工作。主要的入口點不再是generate_tokens,而是 tokenize.tokenize() ;
23.,“import thread”問題,2.x中的子產品thread在3.x中程式設計"_thread"(需要在前面加一個下劃線).否則會出現“ImportError: No module named thread;
24.多個子產品被改名
舊的名字 新的名字
_winreg winreg
ConfigParser configparser
copy_reg copyreg
Queue queue
SocketServer socketserver
repr reprlib