📅  最后修改于: 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('芒果文档')
输出:
芒果文档