Python 最常见的 170 道面试题全解析:2019 版(答案收集)
语言特性
1.谈谈对 Python 和其他语言的区别:
答:Python 是一门语法简洁优美,功能强大无比,应用领域非常广泛,具有强大完备的第三方库,他是一门强类型的可移植、可扩展,可嵌入的解释型编程语言,属于动态语言。
拿 C 语言和 Python 比: Python 的第三方类库比较齐全并且使用简洁,很少代码就能实现一些功能,如果用 C 去实现相同的功能可能就比较复杂。
但是对于速度来说 Python 的运行速度相较于 C 就比较慢了。
所以有利的同时也有弊端,毕竟我们的学习成本降低了。
如需了解更多,你还可以去看详情
2.简述解释型和编译型编程语言:
解释型语言是在运行程序的时候才翻译,每执行一行,要翻译一行,边翻译边执行,效率较低。
编译型就是直接编译成机型可以执行的,只翻译一次,所以效率相对来说较高。
如需了解更多,你还可以去看详情
3.Python 的解释器种类以及相关特点?
CPython c 语言开发的,使用最广的解释器
IPython 基于 cPython 之上的一个交互式计时器,交互方式增强功能和 cPython 一样
PyPy 目标是执行效率,采用 JIT 技术。对 Python 代码进行动态编译,提高执行效率
JPython 运行在 Java 上的解释器,直接把 Python 代码编译成 Java 字节码执行
IronPython 运行在微软 .NET 平台上的解释器,把 Python 编译成 . NET 的字节码。
如需了解更多,你还可以去看详情
4.说说你知道的Python3 和 Python2 之间的区别?
print 在 Python3 中是函数必须加括号,Python2 中 print 为 class。
Python2 中使用 xrange,Python3 使用 range。
Python2 中默认的字符串类型默认是 ASCII,Python3 中默认的字符串类型是 Unicode。
Python2 中/的结果是整型,Python3 中是浮点类型。
Python2 中声明元类:metaclass = MetaClass,Python3 中声明元类:class newclass(metaclass=MetaClass):pass。
如需了解更多,你还可以去看详情
5.Python3 和 Python2 中 int 和 long 区别?
python2中有int(整数)和long(长整数) 如果你想将int转为long可以在数据末尾加L
在python3中只有int(整数)
如需了解更多,你还可以去看详情
6.xrange 和 range 的区别?
如需了解更多,你还可以去看详情
编码规范
7.什么是 PEP8?
如需了解更多,你还可以去看详情
8.了解 Python 之禅么?
通过 import this 语句可以获取其具体的内容。告诉人们如何高效整洁的编写代码
Python之禅 by Tim Peters
优美胜于丑陋(Python 以编写优美的代码为目标)
明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似)
简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现)
复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁)
扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套)
间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题)
可读性很重要(优美的代码是可读的)
即便假借特例的实用性之名,也不可违背这些规则(这些规则至高无上)
不要包容所有错误,除非你确定需要这样做(精准地捕获异常,不写 except:pass 风格的代码)
当存在多种可能,不要尝试去猜测
而是尽量找一种,最好是唯一一种明显的解决方案(如果不确定,就用穷举法)
虽然这并不容易,因为你不是 Python 之父(这里的 Dutch 是指 Guido )
做也许好过不做,但不假思索就动手还不如不做(动手之前要细思量)
如果你无法向人描述你的方案,那肯定不是一个好方案;反之亦然(方案测评标准)
命名空间是一种绝妙的理念,我们应当多加利用(倡导与号召)
如需了解更多,你还可以去看详情
9.了解 dosctring 么?
DocStrings 文档字符串是一个重要工具,用于解释文档程序,帮助你的程序文档更加简单易懂。
我们可以在函数体的第一行使用一对三个单引号 ‘’’ 或者一对三个双引号 “”” 来定义文档字符串。
如需了解更多,你还可以去看详情
你可以使用 __doc__
(注意双下划线) 调用函数中的文档字符串属性
10.了解类型注解么?
如需了解更多,你还可以去看详情
11.例举你知道 Python 对象的命名规范,例如方法或者类等
类:总是使用首字母大写单词串,如 MyClass(大驼峰命名)。
内部类可以使用额外的前导下划线。 变量:小写,由下划线连接各个单词。方法名类似常量:常量名所有字母大写 等
如需了解更多,你还可以去看详情
12.Python 中的注释有几种?
总体来说分为两种,单行注释和多行注释。
- 单行注释在行首是 #。
- 多行注释可以使用三个单引号或三个双引号,包括要注释的内容。
13.如何优雅的给一个函数加注释?
14.如何给变量加注释?
15.Python 代码缩进中是否支持 Tab 键和空格混用。
不允许 tab 键和空格键混用,这种现象在使用 sublime 的时候尤为明显。
一般推荐使用 4 个空格替代 tab 键。
16.是否可以在一句 import 中导入多个库?
可以是可以,但是不推荐。因为一次导入多个模块可读性不是很好,所以一行导入一个模块会比较好。
同样的尽量少用 from modulename import *,因为判断某个函数或者属性的来源有些困难,不方便调试,可读性也降低了。
17.在给 Py 文件命名的时候需要注意什么?
给文件命名的时候不要和标准库库的一些模块重复,比如 abc。
另外要名字要有意义,不建议数字开头或者中文命名。
与标识符命名规则类似
18.例举几个规范 Python 代码风格的工具
pylint 和 flake8
数据类型
字符串
19.列举 Python 中的基本数据类型?
就那6种么,
如需了解更多,你还可以去看详情
20.如何区别可变数据类型和不可变数据类型
说白了:就看内存地址和数据的值能不能对应上
21.将”hello world”转换为首字母大写”Hello World”
字符串操作函数:capitalize()
22.如何检测字符串中只含有数字?
isdigit()检测字符串是否由纯数字组成 十进制
isdecimal()纯数值字符串(中文的也好使)
23.将字符串”ilovechina”进行反转
“ilovechina”[::-1]
24.Python 中的字符串格式化方式你知道哪些?
第一种:%
第二种:format()函数
25.有一个字符串开头和末尾都有空格,比如“ adabdw ”,要求写一个函数把这个字符串的前后空格都去掉。
“ adabdw ”.strip()
26.获取字符串”123456“最后的两个字符。
”123456“[-2::]
27.一个编码为 GBK 的字符串 S,要将其转成 UTF-8 编码的字符串,应如何操作?
a= “S”.encode(“gbk”).decode(“utf-8”,’ignore’)
28.s=”info:xiaoZhang 33 shandong”,用正则切分字符串输出[‘info’, ‘xiaoZhang’, ‘33’, ‘shandong’]
1 | import re |
27.怎样将字符串转换为小写?
使用字符串的 lower() 方法。
28.单引号、双引号、三引号的区别?
单独使用单引号和双引号没什么区别,但是如果引号里面还需要使用引号的时候,就需要这两个配合使用了,
然后说三引号,同样的三引号也分为三单引号和三双引号,两个都可以声名长的字符串时候使用,如果使用 docstring 就需要使用三双引号。
29.a = “你好 中国 “,去除多余空格只留一个空格。
1 | s = "你好 中国 " |
列表
30.已知 AList = [1,2,3,1,2],对 AList 列表元素去重,写出具体过程。
1 | # 用set去重 |
31.如何实现 “1,2,3” 变成 [“1”,”2”,”3”]
1 | str.split(",") |
32.给定两个 list,A 和 B,找出相同元素和不同元素
1 | different_list = [i for i in A if i not in B] |
33.[[1,2],[3,4],[5,6]]一行代码展开该列表,得出[1,2,3,4,5,6]
使用列表推导式
1 | [ j for i in question_list for j in i] |
34.合并列表[1,5,7,9]和[2,2,6,8]
1 | # solution 1 |
35.如何打乱一个列表的元素?
1 | import random |
字典
36.字典操作中 del 和 pop 有什么区别
1 | # pop方法删除指定的键值对,并返回删除的值 |
37.按照字典的内的年龄排序
1 | d1 = [ |
38.请合并下面两个字典 a = {“A”:1,”B”:2},b = {“C”:3,”D”:4}
1 | a.update(b) |
39.如何使用生成式的方式生成一个字典,写一段功能代码。
1 | # 生成一个字典 |
40.如何把元组(“a”,”b”)和元组(1,2),变为字典{“a”:1,”b”:2}
1 | tuple_key = ("a", "b") |
综合
41.Python 常用的数据结构的类型及其特性?
字典中的键是不可变类型,可变类型list和dict不能作为字典键
一个对象能不能作为字典的key,就取决于其有没有__hash__方法
42.如何将元组(“A”,”B”)和元组(1,2),合并成字典{“A”:1,”B”:2}
1 | result_dict = {v: k for k, v in demo_dict.items()} |
43.Python 里面如何实现 tuple 和 list 的转换?
1 | # tuple() |
44.我们知道对于列表可以使用切片操作进行部分元素的选择,那么如何对生成器类型的对象实现相同的功能呢?
1 | # 可以使用itertools.islice()对迭代器进行切片 |
45.请将[i for i in range(3)]改成生成器
1 | (i for i in range(3)) # 方括号改为尖括号即可 |
46.a=”hello”和 b=”你好”编码成 bytes 类型
1 | a.encode() |
47.下面的代码输出结果是什么?
1 | a = (1,2,3,[4,5,6,7],8) |
1 | a = (1, 2, 3, [4, 5, 6, 7], 8) |
48.下面的代码输出的结果是什么?
1 | a = (1,2,3,[4,5,6,7],8) |
1 | a = (1, 2, 3, [4, 5, 6, 7], 8) |
元组中有可变数据类型,就可以修改可变数据类型中的值,修改可变数据类型的值并不会使其内存id发生变化。
高级特性
70. 函数装饰器有什么作用?请列举说明?
装饰器就是一个函数,它可以在不需要做任何代码变动的前提下给一个函数增加额外功能,启动装饰的效果。 它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。 下面是一个日志功能的装饰器
如需了解更多,你还可以去看详情
71. Python 垃圾回收机制?
Python 不像 C++,Java 等语言一样,他们可以不用事先声明变量类型而直接对变量进行赋值。对 Python 语言来讲,对象的类型和内存都是在运行时确定的。这也是为什么我们称 Python 语言为动态类型的原因。
主要体现在下面三个方法:
-引用计数机制
-标记-清除
-分代回收
72. 魔法函数 __call__怎么使用?
将实例化的对象当做函数来调用
73. 如何判断一个对象是函数还是方法?
74. @classmethod 和@staticmethod 用法和区别
相同之处:@staticmethod 和@classmethod 都可以直接类名.方法名()来调用,不用在示例化一个类。
@classmethod 我们要写一个只在类中运行而不在实例中运行的方法。
如需了解更多,你还可以去看详情
75. Python 中的接口如何实现?
接口只是定义了一些方法,而没有去实现
如需了解更多,你还可以去看详情
76. Python 中的反射了解么?
如需了解更多,你还可以去看详情
77. metaclass 作用?以及应用场景?
78. hasattr() getattr() setattr()的用法
79. 请列举你知道的 Python 的魔法方法及用途。
如需了解更多,你还可以去看详情