📜  示例说明Python2.x和Python3.x之间的重要区别

📅  最后修改于: 2020-01-13 04:58:53             🧑  作者: Mango

除法运算符

如果我们要移植代码或在Python 2.x中执行Python 3.x代码,则如果整数除法未引起注意,会很危险(因为它不会引发任何错误)。移植代码时,最好使用浮点值(例如7.0 / 5或7 / 5.0)来获得预期的结果。

print 7 / 5
print -7 / 5
'''
输出, Python 2.x
1
-2
输出, Python 3.x :
1.4
-1.4

 

打印函数print

print是最著名的变化。在这种情况下,Python 2.x中的print函数被Python 3.x中的print()函数所替代,即,要在Python 3.x中进行打印,还需要一对括号。

print 'Hello, 芒果'      # 这是Python2的写法  Python 3.x并不支持这个方式
print('Hope You like these facts')  # Python3写法

如我们所见,如果我们在Python 2.x中使用括号,那么就没有问题,但是如果我们在Python 3.x中不使用括号,则会得到SyntaxError报错。
 

Unicode

在Python 2中,隐式str类型为ASCII。但是在Python 3.x中,隐式str类型是Unicode,这真的给我们带来了更少的麻烦。

print(type('default string '))
print(type(b'string with b '))
'''
输出, Python 2.x (Bytes和str类型一样)


输出, Python 3.x (Bytes和str类型不一样)


'''

Python 2.x也支持Unicode

print(type('default string '))
print(type(u'string with b '))
'''
输出, Python 2.x (Unicode和str类型不同)


输出,  in Python 3.x (Unicode和str类型一致)


'''

 

xrange

Python 2.x的xrange()在Python 3.x中不存在。在Python 2.x中,range返回一个列表,即range(3)返回[0,1,2],而xrange返回一个xrange对象,即xrange(3)返回与Java迭代器类似的迭代器对象,并在需要时生成数字。
如果我们需要多次遍历同一序列,则我们首选range(),因为range提供了一个静态列表。xrange()每次都会重新构造序列。xrange()不支持slice和其他列表方法。xrange()的优点是,当任务要在较大范围内进行迭代时,它可以节省内存。
在Python 3.x中,range函数现在可以执行xrange在Python 2.x中的作用,因此,为了使我们的代码具有可移植性,我们希望坚持使用range。因此,Python 3.x的range函数 Python 2.x的xrange。

for x in xrange(1, 5):
    print(x),
for x in range(1, 5):
    print(x),
'''
输出,  Python 2.x
1 2 3 4 1 2 3 4
输出,  Python 3.x
NameError: name 'xrange' is not defined
'''

 

错误处理

两种版本的错误处理都有很小的变化。在Python 3.x中,必须使用’as’关键字。

try:
    trying_to_check_error
except NameError, err:
    print err, 'Error Caused'   #在Python 3.x 中无法工作
'''
输出,  in Python 2.x:
name 'trying_to_check_error' is not defined Error Caused
输出,  in Python 3.x :
File "a.py", line 3
    except NameError, err:
                    ^
SyntaxError: invalid syntax
'''

 

try:
     trying_to_check_error
except NameError as err: # 'as'在Python 3.x中成为必须
     print (err, 'Error Caused')
'''
输出,  in Python 2.x:
(NameError("name 'trying_to_check_error' is not defined",), 'Error Caused')
输出,  in Python 3.x :
name 'trying_to_check_error' is not defined Error Caused
'''

 

_future_module

这基本上不是两个版本之间的区别,而是在这里要提到的有用的东西。__future__模块的想法是为了帮助迁移。如果我们计划在我们的2.x代码中提供Python 3.x支持,则可以使用_future_将其导入我们的代码中。
例如,在下面的Python 2.x代码中,我们通过__future__模块使用Python 3.x的整数除法行为

# 如下Python 2.x 代码, 除法可行
# 在Python 3.x中也可行, 因为我们使用了__future__
from __future__ import division
print 7 / 5
print -7 / 5

输出:

1.4
-1.4

另一个示例,其中我们使用__future__模块在Python 2.x中使用方括号:

from __future__ import print_function
print('芒果文档')

输出:

芒果文档