python 170道面试题
语言特性
-
谈谈对 Python 和其他语言的区别
-
简述解释型和编译型编程语言
-
Python 的解释器种类以及相关特点?
-
Python3 和 Python2 的区别?
-
Python3 和 Python2 中 int 和 long 区别?
-
xrange 和 range 的区别?
编码规范 -
什么是 PEP8?
-
了解 Python 之禅么?
-
了解 DocStrings 么?
-
了解类型注解么?
-
例举你知道 Python 对象的命名规范,例如方法或者类等
-
Python 中的注释有几种?
-
如何优雅的给一个函数加注释?
-
如何给变量加注释?
-
Python 代码缩进中是否支持 Tab 键和空格混用。
-
是否可以在一句 import 中导入多个库?
-
在给 Py 文件命名的时候需要注意什么?
-
例举几个规范 Python 代码风格的工具
数据类型-字符串 -
列举 Python 中的基本数据类型?
-
如何区别可变数据类型和不可变数据类型
-
将"hello world"转换为首字母大写"Hello World"
-
如何检测字符串中只含有数字?
-
将字符串"ilovechina"进行反转
-
Python 中的字符串格式化方式你知道哪些?
-
有一个字符串开头和末尾都有空格,比如“ adabdw ”,要求写一个函数把这个字符串的前后空格都去掉。
-
获取字符串”123456“最后的两个字符。
-
一个编码为 GBK 的字符串 S,要将其转成 UTF-8 编码的字符串,应如何操作?
-
(1)s=“info:xiaoZhang 33 shandong”,用正则切分字符串输出[‘info’, ‘xiaoZhang’, ‘33’, ‘shandong’]。(2)a = "你好 中国 ",去除多余空格只留一个空格。
-
(1) 怎样将字符串转换为小写。 (2) 单引号、双引号、三引号的区别?
数据类型 - 列表 -
已知 AList = [1,2,3,1,2],对 AList 列表元素去重,写出具体过程。
-
如何实现 “1,2,3” 变成 [“1”,“2”,“3”]
-
给定两个 list,A 和 B,找出相同元素和不同元素
-
[[1,2],[3,4],[5,6]] 一行代码展开该列表,得出 [1,2,3,4,5,6]
-
合并列表 [1,5,7,9] 和 [2,2,6,8]
-
如何打乱一个列表的元素?
数据类型 - 字典 -
字典操作中 del 和 pop 有什么区别
-
按照字典的内的年龄排序
-
请合并下面两个字典 a = {“A”:1,“B”:2},b = {“C”:3,“D”:4}
-
如何使用生成式的方式生成一个字典,写一段功能代码。
-
如何把元组 (“a”,“b”) 和元组 (1,2),变为字典 {“a”:1,“b”:2}
数据类型 - 综合 -
下列字典对象键类型不正确的是?
-
如何交换字典 {“A”:1,“B”:2}的键和值
-
Python 里面如何实现 tuple 和 list 的转换?
-
我们知道对于列表可以使用切片操作进行部分元素的选择,那么如何对生成器类型的对象实现相同的功能呢?
-
请将 [i for i in range(3)] 改成生成器
-
a=“hello” 和 b=“你好” 编码成 bytes 类型
-
下面的代码输出结果是什么?
-
下面的代码输出的结果是什么?
操作类题目 -
Python 交换两个变量的值
-
在读文件操作的时候会使用 read、readline 或者 readlines,简述它们各自的作用
-
json 序列化时,可以处理的数据类型有哪些?如何定制支持 datetime 类型?
-
json 序列化时,默认遇到中文会转换成 unicode,如果想要保留中文怎么办?
-
有两个磁盘文件 A 和 B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件 C 中。
-
如果当前的日期为 20190530,要求写一个函数输出 N 天后的日期,(比如 N 为 2,则输出 20190601)。
-
写一个函数,接收整数参数 n,返回一个函数,函数的功能是把函数的参数和 n 相乘并把结果返回。
-
下面代码会存在什么问题,如何改进?
-
一行代码输出 1-100 之间的所有偶数。
-
with 语句的作用,写一段代码?
-
Python 字典和 json 字符串相互转化方法
-
请写一个 Python 逻辑,计算一个文件中的大写字母数量
-
请写一段 Python连接Mongo数据库,然后的查询代码。
62.说一说Redis的基本类型 -
请写一段 Python连接Redis数据库的代码。
-
请写一段 Python连接Mysql数据库的代码。
65.了解Redis的事务么
66.了解数据库的三范式么?
67.了解分布式锁么
68.用 Python 实现一个 Reids 的分布式锁的功能
69.写一段 Python 使用 mongo 数据库创建索引的代码:
高级特性 -
函数装饰器有什么作用?请列举说明?
-
Python 垃圾回收机制?
-
魔法函数 _call_怎么使用?
-
如何判断一个对象是函数还是方法?
-
@classmethod 和 @staticmethod 用法和区别
-
Python 中的接口如何实现?
-
Python 中的反射了解么?
-
metaclass 作用?以及应用场景?
-
hasattr()、getattr()、setattr() 的用法
-
请列举你知道的 Python 的魔法方法及用途。
-
如何知道一个 Python 对象的类型?
-
Python 的传参是传值还是传址?
-
Python 中的元类 (metaclass) 使用举例
-
简述 any() 和 all() 方法
-
filter 方法求出列表所有奇数并构造新列表,a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
-
什么是猴子补丁?
-
在 Python 中是如何管理内存的?
-
当退出 Python 时是否释放所有内存分配?
正则表达式 -
(1)使用正则表达式匹配出www.baidu.com中的地址(2)a=“张明 98 分”,用 re.sub,将 98 替换为 100
-
正则表达式匹配中(.)和(.?)匹配区别?
-
写一段匹配邮箱的正则表达式
其他内容 -
解释一下 Python 中 pass 语句的作用?
-
简述你对 input()函数的理解
-
Python 中的 is 和==
-
Python 中的作用域
-
三元运算写法和应用场景?
-
了解 enumerate 么?
-
列举 5 个 Python 中的标准模块
-
如何在函数中设置一个全局变量
-
pathlib 的用法举例
-
Python 中的异常处理,写一个简单的应用场景
-
Python 中递归的最大次数,那如何突破呢?
-
什么是面向对象的 mro
-
isinstance 作用以及应用场景?
-
什么是断言?应用场景?
-
lambda 表达式格式以及应用场景?
-
新式类和旧式类的区别
-
dir()是干什么用的?
-
一个包里有三个模块,demo1.py、demo2.py、demo3.py,但使用 from tools import *导入模块时,如何保证只有 demo1、demo3 被导入了。
-
列举 5 个 Python 中的异常类型以及其含义
-
copy 和 deepcopy 的区别是什么?
-
代码中经常遇到的*args, **kwargs 含义及用法。
-
Python 中会有函数或成员变量包含单下划线前缀和结尾,和双下划线前缀结尾,区别是什么?
-
w、a+、wb 文件写入模式的区别
-
举例 sort 和 sorted 的区别
-
什么是负索引?
-
pprint 模块是干什么的?
-
解释一下 Python 中的赋值运算符
-
解释一下 Python 中的逻辑运算符
-
讲讲 Python 中的位运算符
-
在 Python 中如何使用多进制数字?
-
怎样声明多个变量并赋值?
算法和数据结构 -
已知:
-
用 Python 实现一个二分查找的函数
-
Python 单例模式的实现方法
-
使用 Python 实现一个斐波那契数列
-
找出列表中的重复数字
-
找出列表中的单个数字
-
写一个冒泡排序
-
写一个快速排序
-
写一个拓扑排序
-
Python 实现一个二进制计算
-
有一组“+”和“-”符号,要求将“+”排到左边,“-”排到右边,写出具体的实现方法。
-
单链表反转
-
交叉链表求交点
-
用队列实现栈
-
找出数据流的中位数
-
二叉搜索树中第 K 小的元素
爬虫相关 -
在 requests 模块中,requests.content 和 requests.text 什么区别
-
简要写一下 lxml 模块的使用方法框架
-
说一说 scrapy 的工作流程
-
scrapy 的去重原理
-
scrapy 中间件有几种类,你用过哪些中间件
-
你写爬虫的时候都遇到过什么?反爬虫措施,你是怎么解决的?
-
为什么会用到代理?
-
代理失效了怎么处理?
-
列出你知道 header 的内容以及信息
-
说一说打开浏览器访问 www.baidu.com 获取到结果,整个流程。
-
爬取速度过快出现了验证码怎么处理
-
scrapy 和 scrapy-redis 有什么区别?为什么选择 redis 数据库?
-
分布式爬虫主要解决什么问题
-
写爬虫是用多进程好?还是多线程好? 为什么?
-
解析网页的解析器使用最多的是哪几个
-
需要登录的网页,如何解决同时限制 ip,cookie,session(其中有一些是动态生成的)在不使用动态爬取的情况下?
-
验证码的解决?
-
使用最多的数据库(mysql,mongodb,redis 等),对他的理解?
网络编程 -
TCP 和 UDP 的区别?
-
简要介绍三次握手和四次挥手
-
什么是粘包? socket 中造成粘包的原因是什么? 哪些情况会发生粘包现象?
并发 -
举例说明 concurrent.future 的中线程池的用法
-
说一说多线程,多进程和协程的区别。
-
简述 GIL
-
进程之间如何通信
-
IO 多路复用的作用?
-
select、poll、epoll 模型的区别?
-
什么是并发和并行?
-
一个线程 1 让线程 2 去调用一个函数怎么实现
-
解释什么是异步非阻塞?
-
threading.local 的作用?
Git 面试题 -
说说你知道的 git 命令
-
git 如何查看某次提交修改的内容
语言特性 -
谈谈对 Python 和其他语言的区别
答:Python 是一门语法简洁优美,功能强大无比,应用领域非常广泛,具有强大完备的第三方库,他是一门强类型的可移植、可扩展,可嵌入的解释型编程语言,属于动态语言。
拿 C 语言和 Python 比: Python 的第三方类库比较齐全并且使用简洁,很少代码就能实现一些功能,如果用 C 去实现相同的功能可能就比较复杂。但是对于速度来说 Python 的运行速度相较于 C 就比较慢了。所以有利的同时也有弊端,毕竟我们的学习成本降低了。
- 简述解释型和编译型编程语言
答:解释型语言是在运行程序的时候才翻译,每执行一次,要翻译一次,效率较低。 编译型就是直接编译成机型可以执行的,只翻译一次,所以效率相对来说较高。
- Python 的解释器种类以及相关特点?
答:
CPython c 语言开发的,使用最广的解释器
IPython 基于 cPython 之上的一个交互式计时器,交互方式增强功能和 cPython 一样
PyPy 目标是执行效率,采用 JIT 技术。对 Python 代码进行动态编译,提高执行效率
JPython 运行在 Java 上的解释器,直接把 Python 代码编译成 Java 字节码执行
IronPython 运行在微软 .NET 平台上的解释器,把 Python 编译成 . NET 的字节码。
4. Python3 和 Python2 的区别?
答: 这里例举 5 条
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 类型最大值不能超过 sys.maxint,而且这个最大值是平台相关的。可以通过在数字的末尾附上一个L来定义长整型,显然,它比 int 类型表示的数字范围更大。在 Python3 里,只有一种整数类型 int,大多数情况下,和 Python2中的长整型类似。
- xrange 和 range 的区别?
答:xrange 是在 Python2 中的用法,Python3 中只有 range xrange 用法与 range 完全相同,所不同的是生成的不是一个 list 对象,而是一个生成器。
编码规范
- 什么是 PEP8?
答:PEP8 通常会听别人提到,但是具体的指什么内容呢,简单介绍下。 《Python Enhancement Proposal #8》(8 号 Python 增强提案)又叫 PEP8,他针对的 Python 代码格式而编订的风格指南。
- 了解 Python 之禅么?
答:通过 import this 语句可以获取其具体的内容。它告诉大家如何写出高效整洁的代码。
- 了解 DocStrings 么?
答:DocStrings 文档字符串是一个重要工具,用于解释文档程序,帮助你的程序文档更加简单易懂。主要是解释代码作用的。
- 了解类型注解么?
答:PEP 484 引入了类型提示,这使得可以对 Python 代码进行静态类型检查。 在使用 Ide 的时候可以获取到参数的类型,更方便传入参数。使用格式如下
def foo(num: int) -> None:
print(f"接收到的数字是:{num}")
介绍下这个简单例子,我们可以在函数的参数部分使用参数名+:+类型,来指定参数可以接受的类型,这里的话就是 num 参数为 int 类型,然后后面->接的是返回值的类型。这里返回值为 None,然后通过 fstring 格式化字符串输出传入的数字。
- 例举你知道 Python 对象的命名规范,例如方法或者类等
答:
类:总是使用首字母大写单词串,如 MyClass。内部类可以使用额外的前导下划线。 变量:小写,由下划线连接各个单词。方法名类似 常量:常量名所有字母大写 等
- Python 中的注释有几种?
答:总体来说分为两种,单行注释和多行注释。
单行注释在行首是 #。
多行注释可以使用三个单引号或三个双引号,包括要注释的内容。
13. 如何优雅的给一个函数加注释?
答:可以使用 docstring 配合类型注解
- 如何给变量加注释?
答:可以通过变量名:类型的方式如下
a: str = “this is string type”
15. Python 代码缩进中是否支持 Tab 键和空格混用。
答:不允许 tab 键和空格键混用,这种现象在使用 sublime 的时候尤为明显。
一般推荐使用 4 个空格替代 tab 键。
- 是否可以在一句 import 中导入多个库?
答:可以是可以,但是不推荐。因为一次导入多个模块可读性不是很好,所以一行导入一个模块会比较好。同样的尽量少用 from modulename import *,因为判断某个函数或者属性的来源有些困难,不方便调试,可读性也降低了。
- 在给 Py 文件命名的时候需要注意什么?
答:给文件命名的时候不要和标准库库的一些模块重复,比如 abc。 另外要名字要有意义,不建议数字开头或者中文命名。
- 例举几个规范 Python 代码风格的工具
答:pylint 和 flake8
数据类型-字符串
- 列举 Python 中的基本数据类型?
答: Python3 中有六个标准的数据类型:字符串(String)、数字(Digit)、列表(List)、元组(Tuple)、集合(Sets)、字典(Dictionary)。
- 如何区别可变数据类型和不可变数据类型
答: 从对象内存地址方向来说
可变数据类型:在内存地址不变的情况下,值可改变(列表和字典是可变类型,但是字典中的 key 值必须是不可变类型)
不可变数据类型:内存改变,值也跟着改变。(数字,字符串,布尔类型,都是不可变类型)可以通过 id() 方法进行内存地址的检测。
21. 将"hello world"转换为首字母大写"Hello World"
答: 这个得看清题目是要求两个单词首字母都要大写,如果只是第一个单词首字母大小的话,只使用 capitalize 即可,但是这里是两个单词,所以用下面的方法。
arr = “hello world”.split(" “)
new_str = f”{arr[0].capitalize()} {arr[1].capitalize()}"
print(new_str)
后来评论中有朋友提到了下面的方法,这里感谢这位朋友提醒。方案如下
“hello world”.title()
非常简单一句话搞定。
- 如何检测字符串中只含有数字?
答:可以通过 isdigit 方法,例子如下
s1 = “12223”.isdigit()
print(s1)
s2 = “12223a”.isdigit()
print(s2)
#结果如下:
#True
#False
23. 将字符串"ilovechina"进行反转
答:
s1 = “ilovechina”[::-1]
print(s1)
24. Python 中的字符串格式化方式你知道哪些?
答:%s,format,fstring(Python3.6 开始才支持,现在推荐的写法)
- 有一个字符串开头和末尾都有空格,比如“ adabdw ”,要求写一个函数把这个字符串的前后空格都去掉。
答:因为题目要是写一个函数所以我们不能直接使用 strip,不过我们可以把它封装到函数啊
def strip_function(s1):
return s1.strip()
s1 = " adabdw "
print(strip_function(s1))
26. 获取字符串”123456“最后的两个字符。
答:切片使用的考察,最后两个即开始索引是 -2,代码如下
a = “123456”
print(a[-2::])
27. 一个编码为 GBK 的字符串 S,要将其转成 UTF-8 编码的字符串,应如何操作?
答:
a= “S”.encode(“gbk”).decode(“utf-8”,‘ignore’)
print(a)
28. (1)s=“info:xiaoZhang 33 shandong”,用正则切分字符串输出[‘info’, ‘xiaoZhang’, ‘33’, ‘shandong’]。(2)a = "你好 中国 ",去除多余空格只留一个空格。
答:
(1)我们需要根据冒号或者空格切分
import re
s = “info:xiaoZhang 33 shandong”
res = re.split(r":| ", s)
print(res)
(2)
s = “你好 中国 "
print(” ".join(s.split()))
29. (1) 怎样将字符串转换为小写。 (2) 单引号、双引号、三引号的区别?
答: (1) 使用字符串的 lower() 方法。
(2)单独使用单引号和双引号没什么区别,但是如果引号里面还需要使用引号的时候,就需要这两个配合使用了,然后说三引号,同样的三引号也分为三单引号和三双引号,两个都可以声名长的字符串时候使用,如果使用 docstring 就需要使用三双引号。
数据类型 - 列表
- 已知 AList = [1,2,3,1,2],对 AList 列表元素去重,写出具体过程。
答:
list(set(AList))
31. 如何实现 “1,2,3” 变成 [“1”,“2”,“3”]
答:
s = “1,2,3”
print(s.split(","))
32. 给定两个 list,A 和 B,找出相同元素和不同元素
答:
A、B 中相同元素:print(set(A)&set(B))
A、B 中不同元素:print(set(A)^set(B))
33. [[1,2],[3,4],[5,6]] 一行代码展开该列表,得出 [1,2,3,4,5,6]
答:
l = [[1,2],[3,4],[5,6]]
x=[j for i in l for j in i]
print(x)
34. 合并列表 [1,5,7,9] 和 [2,2,6,8]
答:使用 extend 和 + 都可以。
a = [1,5,7,9]
b = [2,2,6,8]
a.extend(b)
print(a)
35. 如何打乱一个列表的元素?
答:
import random
a = [1, 2, 3, 4, 5]
random.shuffle(a)
print(a)
数据类型 - 字典
- 字典操作中 del 和 pop 有什么区别
答:del 可以根据索引(元素所在位置)来删除的,没有返回值。 pop 可以根据索引弹出一个值,然后可以接收它的返回值。
- 按照字典的内的年龄排序
d1 = [
{‘name’:‘alice’, ‘age’:38},
{‘name’:‘bob’, ‘age’:18},
{‘name’:‘Carl’, ‘age’:28},
]
答:
d1 = [
{‘name’: ‘alice’, ‘age’: 38},
{‘name’: ‘bob’, ‘age’: 18},
{‘name’: ‘Carl’, ‘age’: 28},
]
print(sorted(d1, key=lambda x:x[“age”]))
38. 请合并下面两个字典 a = {“A”:1,“B”:2},b = {“C”:3,“D”:4}
答: 合并字典方法很多,可以使用 a.update(b) 或者下面字典解包的方式
a = {“A”:1,“B”:2}
b = {“C”:3,“D”:4}
print({**a,**b})
39. 如何使用生成式的方式生成一个字典,写一段功能代码。
答:
需求 3: 把字典的 key 和 value 值调换;
d = {‘a’:‘1’, ‘b’:‘2’}
print({v:k for k,v in d.items()})
40. 如何把元组 (“a”,“b”) 和元组 (1,2),变为字典 {“a”:1,“b”:2}
答 zip 的使用,但是最后记得把 zip 对象再转换为字典。
a = (“a”, “b”)
b = (1, 2)
print(dict(zip(a, b)))
数据类型 - 综合
- 下列字典对象键类型不正确的是?
A:{1:0,2:0,3:0}
B:{“a”:0, “b”:0, “c”:0}
C: {(1,2):0, (2,3