天天看點

Python2.x與Python3​​.x版本差別

       學習了一段時間的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