python2 python3區別(續)

1.除法python

Python2函數

Python3spa

int/int → intci

int/int → floatit

  1. python2下整數除以整數返回整數類型,python3下整數除以整數返回浮點數類型
  2. 當某些語句假定變量爲整數類型時,上面的區別會形成python3下的運行時錯誤。

建議兼容寫法:io

  1. 建議新寫python2腳本時加入from __future__ import division, 這樣Python2的腳本就會與python3行爲一致,也返回浮點數。
  2. 必須使用整數的地方建議使用類型轉換, int(), math.floor(), math.ceil(), floor(), round() 等
  3. 注意向下取整除法運算符"//" 只在兩個操做數都爲整數時返回整數類型,不然返回浮點數 x.0, 此運算符在python2和python3下行爲一致。 

2.數字table

Python2import

Python3變量

int類型的最大值爲sys.maxint迭代器

int無最大值限制

long類型無最大值

取消long類型,全部整數爲int類型

   

常量1L表示long類型的常量

1L爲語法錯誤

   

八進制常量以0或0o開頭

,如0600, 0o600

八進制常量只能夠用0o開頭,

如0o600

主要兼容問題:

  1. 長整型以及八進制常量在Python3的語法錯誤問題
  2. 運行時期間Python3找不到long類型

建議兼容寫法:

  1. 八進制常數統一使用0o開頭。
  2. 用if判斷python的版本避免python3運行到含long的語句
  3. 判斷變量是否爲數字須要判斷python的版本:isinstance(x, int) or (sys.version_info[0] < 3 and isinstance(x, long)
  4. 不要使用1L之類的數字常量,Python3下爲語法錯誤, 能夠使用long(1)來避免語法錯誤

3迭代器

Python2

Python3

def next():

def __next__()

iter.next()

通常不使用此語句

next(iter)

next(iter)

  1. python2與python3定義迭代器的函數名不一致
  2. python3的內置類中再也不含有next()方法。

建議兼容寫法:

  1. def next(self):
        ....

              ....

          def __next__(self):

             return self.next()

     2. 若是基類中已經按照上面定義了__next__(), 改寫了next()的派生類無需再定義__next__()

     3. 不要使用iter.next(), 統一使用next(iter), 注意next()全局函數在python2下調用類的next()方法,在python3下調用類的__next()__方法.

4字典

Python2

Python3

dict.keys()返回列表

dict.keys()返回迭代器

dict.iterkeys()返回迭代器

無此語句

dict.items()返回列表

dict.items()返回迭代器

dict.has_key(x)

無此函數

x in dict

x in dict

建議兼容寫法:

  1. 不使用iterkeys和has_keys
  2. 用 x in dict替代 dict.has_key(x)
  3. 當須要把keys(), items() 的值賦給變量,或者做爲函數的返回值的時候建議使用list()轉換爲列表。

5異常處理

Python2

Python3

except ImportError, e

語法錯誤

except ImportError as e

except ImportError as e

   

raise ImportError,'msg'

語法錯誤

raise ImportError("msg")

raise ImportError("msg")

以上所有使用Python3的寫法, Python2的寫法再也不被Python3支持。Python3的寫法在python2的語義相同

相關文章
相關標籤/搜索