Python3代码兼容Python2(二者的一些区别)

模块名处理

Python3中将一些Python2的模块名称作了修改,须要咱们作一些处理来保证代码在不一样Python版本中可以正常运行。本文主要记录本身遇获得的一些不一样。
我如今是经过异常处理的方式解决模块名称的问题。html

try:  #python3
    from unittest.mock import MagicMock
except ImportError:  #python3
    from mock import MagicMock
Python3 Python2
input() raw.input(),sys.readline()
整除// /

内置函数

Python3 Python2
unittest.mock.MagicMock mock.MagicMock
urllib.request.urlretrieve urllib.urlretrieve
queue Queue
functools.reduce reduce

使用future特性

通常在Python3代码引入模块代码的首行添加如下代码:python

from __future__ import print_function
from __future__ import division

列表推导式的变量做用域

在Python2中,列表推导式中的索引变量的是能够泄露到其封闭做用域中的。而Python3中则不能够。
下面举一个简单的例子说明这个问题,如咱们在一个for循环内部使用列表推导式web

for i in range(2):
    a = [i for i in range(5)]
    print(i)

在Python3中,上面的代码输出为svg

>>0
>>1

而在Python2中,上面的代码输出为函数

>>4
>>4

这是因为Python2中的列表推导式中的索引变量i的做用域泄露到了for循环中。
一种较好的解决方式是在列表推导式中使用与外层循环变量不一样的索引变量名。url

使用脚本将py2代码转为py3

Python安装目录下的Scripts/2to3.exe能够将Pyhon2代码转换为Python3。
使用命令2to3 -w file.py能够直接在原地修改文件。其余命令能够使用2to3 --help查看。spa

参考资料code

https://www.cnblogs.com/kungfupanda/archive/2016/06/01/5548303.htmlxml