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的语义相同