永远相信美好的事情终将发生

Python2迁移到Python3

  最近看到Github上一个Python的repo有点意思,欲clone下来试一试,然而却发现是Python3.X版本,于是打算将其修改为Python2.7版本。
  So,新的轮子又产生了。
  下面记录在网上查找到的python2与python3的区别:

1
2
Py2转至Py3
2to3 -w file.py # 转换之后的文件保存为 file.py,原文件保存为 file.py.bak
1
2
3
#coding=utf-8
from __future__ import print_function
from __future__ import division
  • 最核心的变化, 对 bytes 和 原生 UNICODE 字符串的支持, 删除了 unicode 对象, str 为原生 unicode 字符串, bytes 替代了之前的 str
  • 类库的变化, 组织结构变了些. 但功能没变. urlparse - > urllib.parse
  • 字符串及编码的变化
  • 去除``,全部改用repr()
  • 关键词加入as 和with,还有True,False,None
  • 捕获异常必须使用except…as…的格式
  • 加入nonlocal语句。使用noclocal x可以直接指派外围(非全局)变量
  • “import thread”问题,2.x中的模块thread在3.x中变成”_thread”(需要在前面加一个下划线).否则会出现”ImportError: No module named thread”
  • input() 函数解析用户的输入
    Python3中input得到的为str;Python2的input的到的为int型,Python2的raw_input得到的为str类型
    统一一下:Python3中用input,Python2中用row_input,都输入为str
  • 除法
    Python3中/表示真除,Python2中/取决于除数被除数是否为整型
    此外,两个版本中,%表示取余,//表示地板除(结果取整)

  • 去除print语句,加入print()函数实现相同的功能。同样的还有 exec语句,已经改为exec()函数。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Python3中print为一个函数,必须用括号括起来;Python2中print为class
    Python2: Python3:

    print "Hello world!" print ("Hello world!")
    print "Hello %s"%("jim") print ("Hello %s"%("jim"))

    print "The answer is", 2*2 print("The answer is", 2*2)
    print x, print(x, end=" ") # 使用空格代替换行
    print print() # 输出新行
    print >>sys.stderr, "fatal error" print("fatal error", file=sys.stderr)

    2.X: print (x, y) # 输出repr((x, y))
    3.X: print((x, y)) # 不同于print(x, y)!
  • xrange模块:
    Python2中range()和xrange()是两种不同的实现,在Python3中,range()被移除了,保留了xrange()的实现,但将xrange()重新命名成range()

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Python2:

    1. range()返回整个list
    2. xrange()返回的是一个可迭代的 xrange object
    3. 二者都适用于 for 循环
    4. xrange()占用更少的内存

    range(5) >>> [0, 1, 2, 3, 4]
    range(1,5) >>> [1, 2, 3, 4]

    xrange(5) >>> xrange(5)
    xrange(1,5) >>> xrange(1, 5)
    list(xrange(5)) >>> [0, 1, 2, 3, 4]

    for i in range(0, 10):
    print i

    for i in xrange(0, 10):
    print i
  • urllib
    2.X中的 urllib 和 urllib2 在3.X中整合为 urllib,其对应关系如下