Python2迁移到Python3
最近看到Github上一个Python的repo有点意思,欲clone下来试一试,然而却发现是Python3.X版本,于是打算将其修改为Python2.7版本。 So,新的轮子又产生了。 下面记录在网上查找到的python2与python3的区别:
1 | Py2转至Py3 |
1 | #coding=utf-8 |
最核心的变化, 对 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
13Python3中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
19Python2:
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 iurllib 2.X中的 urllib 和 urllib2 在3.X中整合为 urllib,
其对应关系如下