Python版本:Python2和Python3区别(最详细)

Python 自 1989 年诞生以来,发展至今已经形成了两大流派即 Python 2.x 和 Python 3.x,虽说两者在语法上存在一些相似,但前后并不兼容,也就是说 Python3 的项目,并不能应用于 Python2 的项目。掌握两个版本间的区别,将有助于我们更好地学习 Python 语言,因此本节将详细介绍Python2 和 Python3 之间的区别。

Python2和Python3

Python 3.0 版本于 2008 年问世,由于 Python3.0 与 Python 2 版本使用相差较大,但前后版本并且不能直接兼容,只能通过转换工具(即 2to3.py)将 Python 2 的项目转换为 Python3。如图所示工具:

图片[1]|Python2和Python3区别(最详细)
图1:不同版本代码转化工具

因此 Python 官方应社区使用者的要求,于 2010 年推出了 Python 2.7 版本,该版本是 Python 2.x 系列中使用最广泛的版本,它是 Python2.x 和 Python3.x 的过渡版本。

Python 官方宣布将于 2020 年结束对 Python2.X 系列的支持,因此 Python3.x 系列将有更大的发展空间。截止 2022 年 1 月,Python 2系列的最后一个版本为 Python 2.7.18,最新的 Python 3 版本为 Python 3.10.2 版本。Python 2 时代已经结束,而 Python3 才是 Python 的未来。

在最新的一篇采访中, Python 之父 Guido Van Rossum 开玩笑称称“ Python 4.0 也许不会到来”。

不同版本间的区别

虽然 Python2.x 系列已经停止的更新,但是对于初学者来说,还是要了解不同版本之间的区别,这对于掌握了解 Python 这门编程语言发展是非常有帮助的,就如同了解一个人一样,我们不能只看它现在如何,也要看它之前,更要看它的将来。

下面内容主要介绍了 Python 2.x 版本与 Python 3.x 版本的区别,希望通过我的介绍可以让您更加全面的认识 Pyhtho 这门语言。

1) print

print 的不同用法是两个版本最大区别之一,在 Python 2 版本中 print 是一个语句,而在 Python3 版本中,print 作为函数存在,实例如下所示:

# Python2
print "hello,艾奇编程网"

# python3
print("hello,艾奇编程网")

Python2 的 print 直接打印紧跟其后的内容,而 Python3 将 print 升个为函数需要加括号后才能打印括号内的内容。在看一组示例:

# py2
>>> print("艾奇编程网")
("艾奇编程网")
#py3
>>> print("艾编程网")
"艾编程网"

上述虽然代码的相同,当使用不同版本进行输出时,却得到了不同的结果。

2) 编码方式不同

Python2.x 版本采用 ASCII 方式编码,而 Python3.x 使用 UTF-8 来编码,之所以这样,是为了增强了 Python 语言的适用能力,使用过 Python 2.x 人都知道,Python 2版本总是会因为编码而出现各种各样的问题, Python 3 版本采用 UTF-8 可以说一项福音,UTF – 8 相比 Ascii 码来说要更加普及和实用,比如可以更好地支持中文或者其他非英文字符。

通过以下代码可以查看不同版本所使用的编码格式,如下所示:

# py2
>>> import sys
>>> sys.getdefaultencoding()
'ascii'

# py3
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'

下面再看一组示例,体验一下使用不容编码格式的影响,如下所示:

#Py2.x
>>>str1 ="艾奇编程网"
>>>str1
'C\xe2\xad\xaf\xe3\xa5\x70\xe2\xb4\xae\xed\x97\x64\xe6\xba\x92'

#Py 3.x
>>>str2 ="艾奇编程网"
>>>str2
'艾奇编程网'

之前我们编码时,总是习惯在最开始的位置加上 -*- coding:utf-8 -*-,其实这是受到 Python2 版本的影响。现在 Python 3 默认采用 UTF-8 来编码,因此这一句也可以省略了,你可以能疑问,为什么 Python 最开始没用使用 UTF-8 来编码,这是因为  Python2 为了兼容 Python1 仍然采用了 Ascii 编码。

3)数据类型变化

Python3 相比于 Python2 来说最大的变化,莫过于数据类型的变化,下面我们做一下详细介绍:

字符串在两个不同容版本间发生的改动比较大,在 Python2 中有两个字符串类型分别是 unicode 和 str,前者表示文本字符串,后者表示字节串,但是两者并没有明显的区别,因此有时会发生编码错误的问题。

在 Python3 对其做了改动,并进行严格的区分, Python3 版本也提供了两个字符串类型,分别是 str 和 bytes(新增),同时去除了 unicode 类型,使用 str 表示字符串类型,使用 bytes 来表示字节串类型。示例如下:

>>>name=b'艾奇编程网'
>>>type(name)
<type 'bytes'>

整数类型也发生了变化,Python2  版本使用 long和 int 类型来表示整数, 在Python3 版本中删除了 long 类型,只用 int 来表示整型,并且支持高精度整数运算。

4) 布尔值变化

在 Python2 中 True 和 False 是两个全局变量,在数值分别对应 1 和 0,由于 Pyhton 2 规定它是变量,因此 True 和 False 就可以指向其他的对象,如下所示:

>>> True = False
>>> True
False
>>> False ="艾奇编程网"
>>> False
'艾奇编程网'

这很容易造成混淆,这与 Python 的设计理念背道而驰,Python3 版本对其进行了更正,将 True 和 False 作为了两个关键字来使用,而不是变量,这样他们就只能指向两个固定的对象,不允许被重新定义赋值,否则会发生类型错误。如下所示:

>>> True = "www.91yiqixue.com"
  File "<stdin>", line 1
    True = "www.91yiqixue.com"
    ^^^^
SyntaxError: cannot assign to True

5) 运算符变化

Python 3 的运算符相比较于 Python2 也发生了比较大的变化,比如不等运算符、除法,下面做简单的介绍:

在 Python2 提供了两种不等于的写法即!=<>,而 Python3 只有一种写法,即!=。同时,除法运算发生了变化,在 Python2 的除法和 C语言类似,整数相除法的结果仍是一个整数(即使无法整除,原则是向下取整),只有当有浮点数参数运算时才会保留小数部分,如下所示:

# Python2版本
>>>1/2
0
>>>3.0/2
1.5

而 Python3 版本中整数之间的除法也会返回浮点数,如下所示:

>>>1/2
0.5

在 Python 3 中的地板除运算符//与 Python 2 的地板除使用方法相同,通过该运算符进行除法运算,只会返回一个整数,示例如下:

#Py 2.x
>>> 1//2
0

#Py3
>>> 1//2
0

6) 迭代器

Python 2 版本提供了 range 和 xrange 函数都可以用来生成整数序列,虽然他们的用法相同,但是前者返回的是一个列表,后者则返回迭代器,需要通过 list() 方法将其转化为列表。

Python 3 只提供 range() 函数,其使用方法等同于 xrange(),返回值是一个迭代器对象,示例如下:

# py3版本的range用法
>>> a =range(2)
>>> type(a)
<class 'range'>
>>> list(a)
[0, 1]

在 Python3 版本中有几个内置函数的返回值发生了变化,比如 map()、filter()、zip() 函数,它们不再直接返回列表对象,而是先返回一个迭代器,需要通过 list() 方法才能转换列表。同时 dict.keys()、dict.values()、dict.items() 也不再返回列表,而是返回一个迭代器,这里不再注意列举。

7) nonlocal局部变量声明

Python 3 新增可 nonlocal 关键字,它可以在嵌套作用域中声明一个非局部变量,示例如下:

nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量。
'''
def add():
    x = 0
    def new_add():
        nonlocal x
        x=x+3
        return x
    return new_work
        
f=add()
print(f())
print(f())
print(f())

输出结果:

3
6
9

通过 nonlocal 的声明,我们就可以在连个函数的嵌套作用域内使用 外部变量,此种方法通常应用于 Python 闭包。

8) 异常处理变化

Python3 异常处理机制相比于 Python2 也发生了一些变化,首先,在 Python 2 中所有类型对象的异常都是直接抛出的,但是在 Python3 中只有继承了 BaseException 的对象才可以直接抛出异常,其次 Python3 版本引入了 as 关键字,异常捕获的语法如下所示:

except Exception as xxxException

这与 Python 2 中使用 except Exception,xxxException 语句来捕获异常不同,最后 Python 3 取消了 .message 属性。现在对两个版本的异常处理语法做简单对比,如下所示:

# py2 异常处理
try:
    raise OSError,"系统类型错误"
except OSError,err:
    print err.message

#Py3 异常处理
try:
    raise OSError("系统类型错误")
except TypeError as err:
    print(err)

9)八进制表示不同

Python3 与 Python2 相比,另外一个较小的变化是八进制的字面量表示不同。在 Python 3  中表示八进制方法只有一种必须以“0o”开头,下面看一组示例说明:

# py3语法
>>> 0o2000
1024
>>> 02000
  File "<stdin>", line 1
    02000
    ^
SyntaxError: leading zeros in decimal integer literals are not permitted; use an 0o prefix for octal integers

py2 语法
>>>0o2000
1024
>>>02000
1024

关于 Python2 与 Python3 的不同之处,其实还有一些,比如 raw_input 和 input() 和 类对象继承顺序等,如果感兴趣的话可以自行搜索。总之, Python3 将是未来发展的方向,尽快熟悉 Python3 版本,这对于我们今后的学习将大有裨益。

© 版权声明
THE END
喜欢就支持一下吧
点赞5赞赏
分享
评论 抢沙发
HarryPotter的头像|艾奇编程网

昵称

取消
昵称表情