Division operator
如果我们要移植代码或在python 2.x中执行python 3.x代码,如果整数除法更改未被注意会很危险(因为它不会引发任何错误)。 移植代码时,最好使用浮点值(例如7.0 / 5或7 / 5.0)来获得预期的结果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
print 7 / 5 print -7 / 5 ''' Output in Python 2.x 1 -2 Output in Python 3.x : 1.4 -1.4 ''' |
print function
这是最著名的更改。 在这种情况下,Python 2.x中的print关键字被Python 3.x中的print()函数取代。 但是,如果在print关键字之后添加空格,则括号在Python 2中有效,因为解释器将其视为表达式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
print 'Hello, Geeks' # Python 3.x doesn't support print('Hope You like these facts') ''' Output in Python 2.x : Hello, Geeks Hope You like these facts Output in Python 3.x : File "a.py", line 1 print 'Hello, Geeks' ^ SyntaxError: invalid syntax ''' |
如我们所见,如果我们在python 2.x中使用括号,那么就没有问题,但是如果我们在python 3.x中不使用括号,则会出现SyntaxError。
Unicode:
在Python 2中,隐式str类型为ASCII。 但是在Python 3.x中,隐式str类型是Unicode。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
print(type('default string ')) print(type(b'string with b ')) ''' Output in Python 2.x (Bytes is same as str) <type 'str'> <type 'str'> Output in Python 3.x (Bytes and str are different) <class 'str'> <class 'bytes'> ''' |
python2也支持Unicode
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
print(type('default string ')) print(type(u'string with b ')) ''' Output in Python 2.x (Unicode and str are different) <type 'str'> <type 'unicode'> Output in Python 3.x (Unicode and str are same) <class 'str'> <class 'str'> ''' |
xrange:
Python 3.x中不存在Python 2.x的xrange()。 在Python 2.x中,range返回一个列表,即range(3)返回[0,1,2],而xrange返回一个xrange对象i。 例如,xrange(3)返回迭代器对象,该对象的工作方式类似于Java迭代器,并在需要时生成数字。
如果我们需要多次遍历同一序列,则我们首选range(),因为range提供了一个静态列表。 xrange()每次都会重新构造序列。 xrange()不支持切片和其他列表方法。 xrange()的优点是,当任务要在较大范围内进行迭代时,它可以节省内存。
在Python 3.x中,range函数现在可以执行xrange在Python 2.x中的作用,因此,为了使我们的代码具有可移植性,我们可能希望坚持使用range。 因此,Python 3.x的range函数是Python 2.x的xrange。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
for x in xrange(1, 5): print(x), for x in range(1, 5): print(x), ''' Output in Python 2.x 1 2 3 4 1 2 3 4 Output in Python 3.x NameError: name 'xrange' is not defined ''' |
Error Handling:
两种版本的错误处理都有很小的变化。 在python 3.x中,必须使用“ as”关键字。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
try: trying_to_check_error except NameError, err: print err, 'Error Caused' # Would not work in Python 3.x ''' Output in Python 2.x: name 'trying_to_check_error' is not defined Error Caused Output in Python 3.x : File "a.py", line 3 except NameError, err: ^ SyntaxError: invalid syntax ''' |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
try: trying_to_check_error except NameError as err: # 'as' is needed in Python 3.x print (err, 'Error Caused') ''' Output in Python 2.x: (NameError("name 'trying_to_check_error' is not defined",), 'Error Caused') Output in Python 3.x : name 'trying_to_check_error' is not defined Error Caused ''' |
__future__模块:
这基本上不是两个版本之间的区别,而是在这里需要提及的有用内容。 __future__模块的想法是帮助迁移到Python3.x。
如果我们计划在2.x代码中提供Python 3.x支持,则可以在代码中使用_future_导入。
例如,在下面的Python 2.x代码中,我们通过__future__模块使用Python 3.x的整数除法行为。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# In below python 2.x code, division works # same as Python 3.x because we use __future__ from __future__ import division print 7 / 5 print -7 / 5 Output : 1.4 -1.4 |