Python面试题系列之02 Python 2 与 Python 3 的区别

Python面试题系列之02: Python 2 与 Python 3 的区别

Question

请简述下Python 2Python 3的区别?

知识点详解

这里主要从基本语法角度来谈谈Python 2Python 3的差异:

1 核心差异

1.1 Python 3 对 Unicode 字符的原生支持

Python 2中使用ASCII码作为默认编码方式导致string有两种类型strunicodePython 3只支持unicodestring

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是等价的,所以在缩进中可以同时允许tabspace在代码中共存。

Python 3中使用了更加严格的缩进,不允许tabspace共存,否则会导致报错:

TabError:inconsistent use of tabs and spaces in indentation.

在缩进时混用tabspace会导致部分IDE使用存在问题,如Vim编辑器。不过像PyCharmVS Code这些编辑器可以自动转换tabspace,参考如下配置。

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 3range的这种机制,极大程度上提升了大数据集下的生成效率。

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 2round函数返回float类型值

isinstance(round(15.5), int)
# Flase

Python 3round函数返回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 3Python 2这么多区别,最后还是希望大家果断放弃Python 2🤣,拥抱Python 3😁,欢迎大家在评论区留言说出自己的看法。此外据说在2023年某个时间段就能看到Python 4😉了。

好了,以上就是本篇全部内容。

备注:本篇首发于知识星球「人人都是Pythonista」。


文章作者: &娴敲棋子&
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 &娴敲棋子& !
评论
  目录