python2和python3之间的差异和区别
本文目的为整理所有py2和3的差异,为学习或者代码兼容/重构提供参考。
本文资料参考:
1、https://www.cnblogs.com/geogre123/p/10837462.html
2、lib2to3源码
3、https://www.jianshu.com/p/ea54c2c7a3ea
4、https://www.cnblogs.com/zhaop8078/p/11363237.html
一、基本语法差异
| 相关字符 | python2 | python3 | 解决方法 | 备注 |
|
str.decode() str.encode() |
只有str类型,encode和decode返回结果都是str | 返回结果是bytes | bytes是py3新增的类型 | |
|
字符串默认编码 len(str) |
根据函数头注释编码,如果是utf8编码,一个中文算3个长度 |
默认均使用unicode编码,一个中文算一个长度 | len(str.encode("utf-8")) | |
| / | 3 / 2 -> 1 | 3 / 2 -> 1.5 | 使用// | |
| type: int 和 long |
两种整形 1L |
统一为int 1 |
int | |
| sort | sorted(iterable, cmp=None, key=None, reverse=False) | sorted(iterable, key=None, reverse=False) | 手动修改/不使用 | 移除了cmp参数 |
| 函数定义 | 不可以用中文定义 | 可以用中文 | ||
| raise | raise E, V, T | raise E(V).with_traceback(T) | lib2to3可以修复 | |
| 关键字参数 | 限定关键字参数 *后的变量必须加入名字=值 | |||
| 解包 |
>>> def unpacks(a, (b, c)): ... return a,b,c |
>>> def unpacks(a, b): |
||
| 高级解包 | 高级解包操作:a,b,*rest = range(10) | 关于解包,细碎的问题比较多 | ||
| except | except (Exception1, Exception2), target | except (Exception1, Exception2) as target | lib2to3可以修复 | |
| import | import导入自建包 | 导入系统包 | from . import | |
| round |
round返回值为浮点。 |
round返回值为整形(如果第二个参数为空)。 |
||
| 关键字 | 函数 | lib2to3可以修复 | ||
| exec | 关键字 | 函数 | lib2to3可以修复 | |
| metaclass | __metaclass__ attribute | metaclass parameter | lib2to3可以修复 | |
| 不等于 | <> | != | lib2to3可以修复 | |
| for ... in ... | for i in 1, 2, 3 | for i in (1, 2, 3) | lib2to3可以修复 | |
| StandardError | 移除 | lib2to3可以修复 | ||
| Class | 旧式类和新式类两种 | 移除旧式类 |
二、移除的函数/关键字
| python2 函数 | python3 对应修改 | 备注 |
| 内建函数:coerce() | def cmp(): return (a > b) - (a < b) | |
| 内建函数:cmp() | 使用numeric operator | |
| 内建函数:raw_input() | input() | lib2to3可以修复 |
| file() | open(pathname) | 如果是检查类型,使用io.IOBase |
| 关键字:execfile | exec() | lib2to3可以修复 |
|
range() return list xrange() return genrator |
range移除 xrange重命名为range |
|
| 内建type:buffer | 使用 memoryview | |
| apply() | ||
| long() | int() | |
| basestring() | str() | |
| intern() | sys.intern() | |
| 内建函数:__nonzero__ | ||
| iterkeys() itervalues() iteritems() |
keys() values() iterms() |
三、函数返回值差异
| 函数 | python2 | python3 | 备注 |
| filter() | return list | return iterator | lib2to3可以修复 |
| zip() | return list | return iterator | |
| map() | return list | return iterator |
四、移除的成员函数
| python2 | python3 | 备注 |
| iterator.next() | next(iterator) | lib2to3可以修复 |
|
sys.exitfunc |
atexit | lib2to3可以修复 |
| sys.maxint | sys.maxsize | |
|
sys.exc_type sys.exc_value sys.exc_traceback |
sys.exc_info()[0] sys.exc_info()[1] sys.exc_info()[2] |
|
| os.getcwdu() | os.getcwd() | |
| itertools.(imap|ifilter|izip) | (map|filter|zip) | |
| itertools.ifilterfalse | itertools.filterfalse (bugs 2360-2363) | |
|
operator.isCallable(obj) |
hasattr(obj, '__call__') |
|
| d.has_key(k) | k in d | |
| for x in f.xreadlines() | for x in f |
五、移除的成员属性
| python2 | python3 | 备注 |
|
dict.iterkeys |
iter(dict.keys) |
lib2to3可以修复 |
|
d.viewkeys() |
d.keys() |
|
| iter.next | next(iter) | |
|
f.func_closure |
f.__closure__ |
|
|
method.im_func |
method.__func__ |
|
六、移除的模块
| python2 | python3 | 备注 |
|
dbm |
dbm.ndbm |
lib2to3可以修复 |

浙公网安备 33010602011771号