python2 python3区别(续)
Posted berrycake
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python2 python3区别(续)相关的知识,希望对你有一定的参考价值。
1.除法
Python2 |
Python3 |
int/int → int |
int/int → float |
- python2下整数除以整数返回整数类型,python3下整数除以整数返回浮点数类型
- 当某些语句假定变量为整数类型时,上面的区别会造成python3下的运行时错误。
建议兼容写法:
- 建议新写python2脚本时加入from __future__ import division, 这样Python2的脚本就会与python3行为一致,也返回浮点数。
- 必须使用整数的地方建议使用类型转换, int(), math.floor(), math.ceil(), floor(), round() 等
- 注意向下取整除法运算符"//" 只在两个操作数都为整数时返回整数类型,否则返回浮点数 x.0, 此运算符在python2和python3下行为一致。
2.数字
Python2 |
Python3 |
int类型的最大值为sys.maxint |
int无最大值限制 |
long类型无最大值 |
取消long类型,所有整数为int类型 |
常量1L表示long类型的常量 |
1L为语法错误 |
八进制常量以0或0o开头 ,如0600, 0o600 |
八进制常量只可以用0o开头, 如0o600 |
主要兼容问题:
- 长整型以及八进制常量在Python3的语法错误问题
- 运行时期间Python3找不到long类型
建议兼容写法:
- 八进制常数统一使用0o开头。
- 用if判断python的版本避免python3运行到含long的语句
- 判断变量是否为数字需要判断python的版本:isinstance(x, int) or (sys.version_info[0] < 3 and isinstance(x, long)
- 不要使用1L之类的数字常量,Python3下为语法错误, 可以使用long(1)来避免语法错误
3迭代器
Python2 |
Python3 |
def next(): |
def __next__() |
iter.next() |
一般不使用此语句 |
next(iter) |
next(iter) |
- python2与python3定义迭代器的函数名不一致
- python3的内置类中不再含有next()方法。
建议兼容写法:
- 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 |
建议兼容写法:
- 不使用iterkeys和has_keys
- 用 x in dict替代 dict.has_key(x)
- 当需要把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的语义相同
以上是关于python2 python3区别(续)的主要内容,如果未能解决你的问题,请参考以下文章