Python面试题系列之02: Python 2 与 Python 3 的区别
Question
请简述下Python 2
与Python 3
的区别?
知识点详解
这里主要从基本语法角度来谈谈Python 2
与Python 3
的差异:
1 核心差异
1.1 Python 3 对 Unicode 字符的原生支持
Python 2
中使用ASCII
码作为默认编码方式导致string
有两种类型str
和unicode
,Python 3
只支持unicode
的string
。
Python 2 和 Python 3 字节和字符对应关系为:
Python 2 | Python 3 | 表现 | 转换 | 作用 |
---|---|---|---|---|
str | bytes | 字节 | encode | 存储 |
unicode | str | 字符 | decode | 显示 |
1.2 Python 3 采用绝对路径方式进行 import
在Python 2
中相对路径的import
会导致标准库导入变得困难(设想一下,同一目录下有file.py
,如何同时导入这个文件和标准库file
)。
在Python 3
中这一点将被修改,如果还需要导入同一目录的文件必须使用绝对路径,否则只能使用相关导入的方式来进行导入。
1.3 新式类与老式类
Python 2
中存在老式类和新式类的区别,Python 3
则统一采用新式类。
在Python 2
中新式类声明要求继承object
,必须用新式类应用多重继承。在Python 3
中已经把旧类型去掉了,也就是说已经隐式继承了object
。
1.4 Python 3 使用更加严格的缩进
关于代码缩进,PEP-8
中建议使用空格:
Spaces are the preferred indentation method.
Python 2
的缩进机制中,1个tab
和4个space
是等价的,所以在缩进中可以同时允许tab
和space
在代码中共存。
Python 3
中使用了更加严格的缩进,不允许tab
和space
共存,否则会导致报错:
TabError:inconsistent use of tabs and spaces in indentation.
在缩进时混用tab
和space
会导致部分IDE
使用存在问题,如Vim
编辑器。不过像PyCharm
、VS Code
这些编辑器可以自动转换tab
为space
,参考如下配置。
2 废弃的特性
2.1 print 语句被 Python 3 废弃
print语句被 Python 3 废弃,统一使用print
函数
2.2 exec 语句被 Python 3 废弃
exec语句被 Python 3 废弃,统一使用exec
函数
2.3 execfile 语句被 Python 3 废弃
execfile 语句被 Python 3 废弃,推荐使用exec(open("./filename").read())
2.4 不相等操作符”<>”被 Python 3 废弃
不相等操作符”<>”被 Python 3 废弃,统一使用!=
2.5 long 整数类型被 Python 3 废弃
long 整数类型被 Python 3 废弃,统一使用int
2.6 xrange 函数被 Python 3 废弃
xrange 函数被 Python 3 废弃,统一使用range
Python 2 中range
的返回值是list
,这意味着内存将会分布相应的长度的空间给list
。
Python 3 中返回的是一个对象,并没有将数据完全实例化,所以内存中只有一个对象的空间。Python 3
中range
的这种机制,极大程度上提升了大数据集下的生成效率。
在Python 3
中 要想使用range()
获得一个list
,必须显式调用:
list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2.7 在Python 3 中与dictionary关联的方法已不再返回 list 对象
在Python 3 中与dictionary关联的方法已不再返回 list 对象,涉及的方法有keys()
、values()
、items()
、zip()
、map()
、filter()
,它们是可以通过list
强行转换。
mydict = {"a":1,"b":2,"c":3}
mydict.keys()
# <built-in method keys of dict object at 0x000000000040B4C8>
list(mydict.keys())
# ['a', 'c', 'b']
2.8 迭代器 iterator 的 next()函数被 Python 3 废弃
迭代器 iterator 的 next()函数被 Python 3 废弃,统一使用next(iterator)
2.9 raw_input 函数被 Python 3 废弃
raw_input 函数被 Python 3 废弃,统一使用input
函数
2.10 cPickle 模块被 Python 3 抛弃
cPickle 模块被 Python 3 抛弃,统一使用pickle
模块
2.11 字典变量的 has_key 函数被 Python 3 废弃
字典变量的 has_key 函数被 Python 3 废弃,统一使用in
关键词
2.12 file 函数被 Python 3 废弃
file 函数被 Python 3 废弃,统一使用open
来处理文件,可以通过io.IOBase
检查文件类型
2.13 apply()、execfile()都被去除了被 Python 3 废弃
apply()、execfile()都被去除了,被 Python 3 废弃
2.14 异常 StandardError 被 Python 3 废弃
异常 StandardError 被 Python 3 废弃,统一使用Exception
3 修改的特性
3.1 浮点数除法操作符“/”和“//”的区别
Python 2
中的/
:若为两个整形数进行运算,结果为整形;但若两个数中有一个为浮点数,则结果为浮点数;
Python 3
中的/
:为真除法,运算结果不再根据参加运算的数的类型。
Python 2
中的//
:返回小于除法运算结果的最大整数;从类型上讲,与/
运算符返回类型逻辑一致。
Python 3
中的//
:和Python 2
运算结果一样。
还是有点绕?那就来看看下面的例子:
# Python 2
3 / 2 = 1
3 // 2 = 1
3 / 2.0 = 1.5
3 // 2.0 = 1.0
# Python 3
3 / 2 = 1.5
3 // 2 = 1
3 / 2.0 = 1.5
3 // 2.0 = 1.0
3.2 异常抛出和捕捉机制区别
在Python 2
中的写法
raise IOError, "file error" # 抛出异常
except NameError, err: # 捕捉异常
在Python 3
中的写法
raise IOError("file error") # 抛出异常
except NameError as err: # 捕捉异常
3.3 列表表达式对外部同名变量的影响
Python 2
,列表表达式会修改外部相同名称变量的值
i = 1
print 'comprehension: ', [i for i in range(5)]
print 'after: i =', i # i=4
Python 3
,列表表达式不会修改外部相同名称变量的值
i = 1
print('comprehension: ', [i for i in range(5)])
print('after: i =', i) # i=1
注意:在这里若不使用列表表达式,直接使用for
逻辑,在Python 3
得到的结果与Python 2
也是一致的。
i = 1
for i in range(5):
pass
print('after: i =', i) # i=4
3.4 round 函数返回值区别
Python 2
,round
函数返回float
类型值
isinstance(round(15.5), int)
# Flase
Python 3
,round
函数返回int
类型值
isinstance(round(15.5), float)
# Flase
3.5 比较操作符区别
Python 2
中任意两个对象都可以比较
101 > 'Pythonista'
# False
Python 3
中只有同一数据类型的对象可以比较
101 > 'Pythonista'
# TypeError: '>' not supported between instances of 'int' and 'str'
4 新增的特性
在Python 3.X
中增加的新特性在Python 2
中都不支持,这些新特性的说明在官网中有详细的说明:
3.1 https://docs.python.org/3.1/whatsnew/3.1.html
3.2 https://docs.python.org/3.2/whatsnew/3.2.html
3.3 https://docs.python.org/3.3/whatsnew/3.3.html
3.4 https://docs.python.org/3.4/whatsnew/3.4.html
3.5 https://docs.python.org/3.5/whatsnew/3.5.html
3.6 https://docs.python.org/3.6/whatsnew/3.6.html
3.7 https://docs.python.org/3.7/whatsnew/3.7.html
3.8 https://docs.python.org/3.8/whatsnew/3.8.html
在博客园上有一篇对这些新增特性中重要的点进行介绍的文章,可以作为参考:http://www.cnblogs.com/animalize/p/5633215.html
Answer
在面试中可根据实际情况,并结合上述列出的特性差异有选择地进行回答即可。
后记
本文给大家整理了Python 3
与Python 2
这么多区别,最后还是希望大家果断放弃Python 2
🤣,拥抱Python 3
😁,欢迎大家在评论区留言说出自己的看法。此外据说在2023年某个时间段就能看到Python 4
😉了。
好了,以上就是本篇全部内容。
备注:本篇首发于知识星球「人人都是Pythonista」。