python2和python3的不同点_Python2.x和Python3.x之间的重要区别及示例

除法运算符

如果我们在Python2.x中移植代码或执行Python3.x代码,那么如果不注意整数除法的更改(因为它不会引发任何错误),则会很危险。移植代码时,最好使用浮动值(如7.0/5或7/5.0)来获得预期的结果。

print 7 / 5

print -7 / 5

'''

Output in Python 2.x

1

-2

Output in Python 3.x :

1.4

-1.4

print方法

这是最著名的变化。在这种情况下,Python 2.x中的print关键字被Python 3.x中的print()函数替换。但是,如果在Python 2中print关键字后面添加了空格,因为解释器将其计算为一个表达式,则圆括号在Python 2中起作用。

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

如我们所见,如果在Python2.x中使用括号,那么没有问题,但是如果在Python3.x中不使用括号,则会得到SyntaxError。

Unicode编码

在Python2中,隐式str类型是ASCII。但在Python3.x中,隐式str类型是Unicode。

print(type('default string '))

print(type(b'string with b '))

'''

Output in Python 2.x (Bytes is same as str)

Output in Python 3.x (Bytes and str are different)

'''

Python2.x还支持Unicode。

print(type('default string '))

print(type(u'string with b '))

'''

Output in Python 2.x (Unicode and str are different)

Output in Python 3.x (Unicode and str are same)

'''

xrange

Python2.x的xrange()在Python3.x中不存在,在Python2.x中,range返回一个列表,即range(3)返回[0,1,2],而xrange返回一个xrange对象,即xrange(3)返回iterator对象,它的工作原理类似于Java迭代器,并在需要时生成数字。

如果我们需要在同一序列上迭代多次,我们更喜欢range(),因为range提供了一个静态列表。xrange()每次都会重新构造序列。xrange()不支持切片和其他列表方法。xrange()的优点是,当任务在较大范围内迭代时,它可以节省内存。

在Python3.x中,range函数现在执行的是xrange在Python2.x中所做的工作,因此为了保持代码的可移植性,我们可能希望继续使用range。所以Python3.x的range函数是Python2.x中的xrange。

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

'''

错误处理

两个版本中的错误处理都有一个小的变化。在Python3.x中,“as”关键字是必需的。

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

'''

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代码中支持Python3.x,那么我们可以在代码中使用import __future__。

例如,在下面的Python2.x代码中,我们使用Python3.x的整数除法行为,使用的是__future__模块。

# 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

输出:

1.4

-1.4

另一个例子,我们在Python 2.x中使用了括号,并使用了__future__模块:

from __future__ import print_function

print('www.jkxuexi.com')

输出:

www.jkxuexi.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值