综合常见题
1.谈谈对 Python 和其他语言的区别
自己的描述:
python: 面向对象、解释性, 跨平台,科学计算友好,开发效率高,运行速度一般
java: 面向对象、编译性,跨平台, 使用广泛,市场占用率高
C/C++: 面向过程、编译性,内存占用小,运行效率高
2.简述解释型和编译型编程语言
解释性语言: 一边运行一边解释成机器语言,故运行效率低
编译型语言: 直接编译成机器语言,运行的时候效率很高;比如,c语言,大体上四个步骤: 预处理->编译->汇编->链接[可执行程序]
3.Python 的解释器种类以及相关特点?
Cpython:C语言开发的,应用最广泛的版本
Ipython:基于Cpython之上开发的交互式解释器,只是交互上比cpython有所增强,代码是一致的
pypy: 针对于提高执行速度,采用了JIT技术,对python代码进行动态编译,显著提高执行速度
Jpython: 运行再java平台上的python解释器,可以直接把python变异成java字节码执行
IronPython: IronPython类似于jpython,运行在微软.NET平台的python解释器
4.说说你知道的Python3 和 Python2 之间的区别?
1、print函数
python2: print是一条语句,不需要括号
python3:
2、默认编码:
python2: 默认是ascii编码,必须在顶部声明才能处理非ascii编码
python3: 默认编码为UTF-8
3、在python3中,删除了xrange方法,只能使用range
4、整数除法
python2: 整数相除默认是整除(地板除),可能导致意外结果
python3: 整数相除默认是浮点数除法,地板除使用 //。
print(5 / 2) # 输出 2.5
print(5 // 2) # 输出 2
5、异常处理
python2: 异常使用as语法不统一
pyhton3: 统一使用as关键字处理异常
5.Python3 和 Python2 中 int 和 long 区别?
在 Python 2 和 Python 3 中,`int` 和 `long` 的行为和实现存在以下主要区别:
1. Python 2 中的 int
和 long
-
int
类型:- 表示一个固定精度的整数。
- 在 32 位系统上,范围为
-2^31
到2^31 - 1
。 - 在 64 位系统上,范围为
-2^63
到2^63 - 1
。 - 超出范围会自动转为
long
类型。
-
long
类型:- 表示一个可变精度的长整型,理论上可以表示任意大的整数。
- 以
L
或l
后缀表示长整型:num = 12345678901234567890L
-
区别:
int
是固定范围的,运算超出范围时会自动转换为long
。long
能表示更大的整数,但性能稍慢。
2. Python 3 中的 int
-
统一类型:
- Python 3 取消了
long
类型,所有整数都用int
表示,无论大小。 int
类型是可变精度的,既可以表示 Python 2 中的int
,也可以表示long
。
- Python 3 取消了
-
表示范围:
- 理论上只受限于内存大小,可以表示任意大的整数。
- 不需要加
L
或l
后缀。
-
示例:
num = 123456789012345678901234567890 # 自动处理大整数 print(type(num)) # <class 'int'>
3. 性能
- 在 Python 2 中,由于
int
是固定范围的,其性能比long
快一些。 - 在 Python 3 中,
int
的实现类似于 Python 2 的long
,但优化了性能,所以即使是大整数操作,性能也更好。
4. 示例比较
Python 2:
# int 类型
a = 10
print(type(a)) # 输出 <type 'int'>
# long 类型
b = 12345678901234567890L
print(type(b)) # 输出 <type 'long'>
# 自动转为 long
c = 2**63
print(type(c)) # 输出 <type 'long'>
Python 3:
# int 类型
a = 10
print(type(a)) # 输出 <class 'int'>
# 大整数也是 int
b = 12345678901234567890
print(type(b)) # 输出 <class 'int'>
# 自动支持大整数
c = 2**100
print(type(c)) # 输出 <class 'int'>
5. 总结
特性 | Python 2 | Python 3 |
---|---|---|
整数类型 | int 和 long |
统一为 int |
int 范围 |
受系统架构限制 | 无限制,支持大整数 |
long 类型 |
独立存在,需用 L 后缀区分 |
已移除,统一为 int |
性能 | int 快于 long |
性能优化,统一类型更高效 |
Python 3 的统一设计使得整数操作更直观,建议使用 Python 3 以避免在类型和范围上产生歧义。
6.xrange 和 range 的区别?
7.什么是 PEP8?
Python增强提案 -> 代码规范
8.了解 Python 之禅么?
python解释器中输入: import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly. # 避丑选美
Explicit is better than implicit. # 避隐就显
Simple is better than complex. # 简单好过复杂
Complex is better than complicated.#
Flat is better than nested. # 能不嵌套就不嵌套
Sparse is better than dense.# 不要密密麻麻
Readability counts. # 可读性计数 不要整的谁都看不懂
Special cases aren't special enough to break the rules. # 特殊情况不足以打破规则
Although practicality beats purity.
Errors should never pass silently.# 错误不应该悄悄地过去
Unless explicitly silenced.# 除非明确沉默。
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never. # 现在总比没有好。
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea. # 如果不好解释,那这个可能是个坏主意
If the implementation is easy to explain, it may be a good idea. # 如果实现很容易解释,那么这可能是一个好主意
Namespaces are one honking great idea -- let's do more of those!
9.了解 dosctring 么?
python推崇代码即文档, 通常在函数的第一个语句就表明函数的用法以及接受的参数,可以通过functiong.__doc__属性来获得
10.了解类型注解么?
类型注解是python3的新内容,标记参数及返回值的类型,只是为了程序的可读性
11.例举你知道 Python 对象的命名规范,例如方法或者类等
模块: 尽量小写,单词太多通下划线分割
类: 使用驼峰命名,首字符大写,不使用下划线
函数: 全部使用小写 , 单词太多用下划线连接,私有函数前面加下划线
变量: 全部使用小写,常量全部使用大写,均使用下划线连接
12.Python 中的注释有几种?
# """ """
13.如何优雅的给一个函数加注释?
14.如何给变量加注释?
使用#
15.Python 代码缩进中是否支持 Tab 键和空格混用。
不支持
16.是否可以在一句 import 中导入多个库?
可以,但是不建议
17.在给 Py 文件命名的时候需要注意什么?
全部使用小写加下划线命名
18.例举几个规范 Python 代码风格的工具
YAPF、Black
数据类型
字符串
19.列举 Python 中的基本数据类型?
20.如何区别可变数据类型和不可变数据类型
-
1.不可变数据类型:
- 1.数字类型(int,float,complex)
- 2.字符串(str)
- 3.元祖类型(tuple)
-
2.可变数据类型:
- 1.列表类型(list)
- 2.字典类型(dict)
- 3.集合类型(set)
对于不可变数据类型,赋值给另外一个变量之后,对原数据的修改不会影响到另外一个变量;
21.将"hello world"转换为首字母大写"Hello World"
h = "hello world"
print(h.title())
22.如何检测字符串中只含有数字?
h = "1"
print(h.isnumeric())
23.将字符串"ilovechina"进行反转
h = "hello world"
print(''.join(reversed(h)))
24.Python 中的字符串格式化方式你知道哪些?
25.有一个字符串开头和末尾都有空格,比如“ adabdw ”,要求写一个函数把这个字符串的前后空格都去掉。
26.获取字符串”123456“最后的两个字符。
27.一个编码为 GBK 的字符串 S,要将其转成 UTF-8 编码的字符串,应如何操作?
28.s=“info:xiaoZhang 33 shandong”,用正则切分字符串输出[“info”, “xiaoZhang”, “33”, “shandong”]
27.怎样将字符串转换为小写?
28.单引号、双引号、三引号的区别?
29.a = "你好 中国 ",去除多余空格只留一个空格。
列表
30.已知 AList = [1,2,3,1,2],对 AList 列表元素去重,写出具体过程。
31.如何实现 “1,2,3” 变成 [“1”,“2”,“3”]
32.给定两个 list,A 和 B,找出相同元素和不同元素
33.[[1,2],[3,4],[5,6]]一行代码展开该列表,得出[1,2,3,4,5,6]
34.合并列表[1,5,7,9]和[2,2,6,8]
35.如何打乱一个列表的元素?
字典
36.字典操作中 del 和 pop 有什么区别
37.按照字典的内的年龄排序
38.请合并下面两个字典 a = {“A”:1,“B”:2},b = {“C”:3,“D”:4}
39.如何使用生成式的方式生成一个字典,写一段功能代码。
40.如何把元组(“a”,“b”)和元组(1,2),变为字典{“a”:1,“b”:2}
综合
41.Python 常用的数据结构的类型及其特性?
A:{1:0,2:0,3:0}
B:{“a”:0, “b”:0, “c”:0}
C: {(1,2):0, (2,3):0}
D: {[1,2]:0, [2,3]:0}
42.如何将元组(“A”,“B”)和元组(1,2),合并成字典{“A”:1,“B”:2}
43.Python 里面如何实现 tuple 和 list 的转换?
44.我们知道对于列表可以使用切片操作进行部分元素的选择,那么如何对生成器类型的对象实现相同的功能呢?
45.请将[i for i in range(3)]改成生成器
46.a="hello"和 b="你好"编码成 bytes 类型
47.下面的代码输出结果是什么?
a = (1,2,3,[4,5,6,7],8)
a[2] = 2
48.下面的代码输出的结果是什么?
a = (1,2,3,[4,5,6,7],8)
a[5] = 2
操作类题目
49.Python 交换两个变量的值
50.在读文件操作的时候会使用 read、readline 或者 readlines,简述它们各自的左右
51.json 序列化时,可以处理的数据类型有哪些?如何定制支持 datetime 类型?
52.json 序列化时,默认遇到中文会转换成 unicode,如果想要保留中文怎么办?
53.有两个磁盘文件 A 和 B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件 C 中。
54.如果当前的日期为 20190530,要求写一个函数输出 N 天后的日期,(比如 N 为 2,则输出 20190601)。
55.写一个函数,接收整数参数 n,返回一个函数,函数的功能是把函数的参数和 n 相乘并把结果返回。
56.下面代码会存在什么问题,如何改进?
# def strappend(num):
# str="first"
# for i in range(num):
# str+=str(i)
# return str
57.一行代码输出 1-100 之间的所有偶数。
58.with 语句的作用,写一段代码?
59.python 字典和 json 字符串相互转化方法
60.请写一个 Python 逻辑,计算一个文件中的大写字母数量
高级特性
70.函数装饰器有什么作用?请列举说明?
71.Python 垃圾回收机制?
72.魔法函数 __call__怎么使用?
73.如何判断一个对象是函数还是方法?
74.@classmethod 和@staticmethod 用法和区别
75.Python 中的接口如何实现?
76.Python 中的反射了解么?
77.metaclass 作用?以及应用场景?
78.hasattr() getattr() setattr()的用法
hasattr(object,name): 判断一个对象里面是否有name属性,有name返回True,否则返回False
getattr(object,name[,defalut]):获取对象的object的属性或者方法,如果存在打印出来,如果不存在打印默认值,默认值可选
如果返回的是一个对象实例,那么可以直接加括号就可以直接运行
setattr(object, name, values): 给对象的属性赋值,若是属性不存在,先创建,再赋值
79.请列举你知道的 Python 的魔法方法及用途。
80.如何知道一个 Python 对象的类型?
81.Python 的传参是传值还是传址?
82.Python 中的元类(metaclass)使用举例
83.简述 any()和 all()方法
84.filter 方法求出列表所有奇数并构造新列表,a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
85.什么是猴子补丁?
86.在 Python 中是如何管理内存的?
87.当退出 Python 时是否释放所有内存分配?
正则表达式
88.使用正则表达式匹配出
www.baidu.com中的地址
a=“张明 98 分”,用 re.sub,将 98 替换为 100
89.正则表达式匹配中(.)和(.?)匹配区别?
90.写一段匹配邮箱的正则表达式
其他内容
91.解释一下 python 中 pass 语句的作用?
92.简述你对 input()函数的理解
93.python 中的 is 和==
94.Python 中的作用域
95.三元运算写法和应用场景?
96.了解 enumerate 么?
97.列举 5 个 Python 中的标准模块
98.如何在函数中设置一个全局变量
99.pathlib 的用法举例
100.Python 中的异常处理,写一个简单的应用场景
101.Python 中递归的最大次数,那如何突破呢?
102.什么是面向对象的 mro
103.isinstance 作用以及应用场景?
104.什么是断言?应用场景?
105.lambda 表达式格式以及应用场景?
106.新式类和旧式类的区别
107.dir()是干什么用的?
108.一个包里有三个模块,demo1.py, demo2.py, demo3.py,但使用 from tools import 导入模块时,如何保证只有 demo1、demo3 被导入了。
109.列举 5 个 Python 中的异常类型以及其含义
110.copy 和 deepcopy 的区别是什么?
111.代码中经常遇到的args, **kwargs 含义及用法。
112.Python 中会有函数或成员变量包含单下划线前缀和结尾,和双下划线前缀结尾,区别是什么?
113.w、a+、wb 文件写入模式的区别
114.举例 sort 和 sorted 的区别
115.什么是负索引?
116.pprint 模块是干什么的?
117.解释一下 Python 中的赋值运算符
118.解释一下 Python 中的逻辑运算符
119.讲讲 Python 中的位运算符
120.在 Python 中如何使用多进制数字?
121.怎样声明多个变量并赋值?
算法和数据结构
122.已知:
AList = [1,2,3]
BSet = {1,2,3}
(1) 从 AList 和 BSet 中 查找 4,最坏时间复杂度那个大?
(2) 从 AList 和 BSet 中 插入 4,最坏时间复杂度那个大?
123.用 Python 实现一个二分查找的函数
124.python 单例模式的实现方法
125.使用 Python 实现一个斐波那契数列
126.找出列表中的重复数字
127.找出列表中的单个数字
128.写一个冒泡排序
129.写一个快速排序
130.写一个拓扑排序
131.python 实现一个二进制计算
132.有一组“+”和“-”符号,要求将“+”排到左边,“-”排到右边,写出具体的实现方法。
133.单链表反转
134.交叉链表求交点
135.用队列实现栈
136.找出数据流的中位数
137.二叉搜索树中第 K 小的元素
爬虫相关
138.在 requests 模块中,requests.content 和 requests.text 什么区别
139.简要写一下 lxml 模块的使用方法框架
140.说一说 scrapy 的工作流程
141.scrapy 的去重原理
142.scrapy 中间件有几种类,你用过哪些中间件
143.你写爬虫的时候都遇到过什么?反爬虫措施,你是怎么解决的?
144.为什么会用到代理?
145.代理失效了怎么处理?
146.列出你知道 header 的内容以及信息
147.说一说打开浏览器访问 www.baidu.com 获取到结果,整个流程。
148.爬取速度过快出现了验证码怎么处理
149.scrapy 和 scrapy-redis 有什么区别?为什么选择 redis 数据库?
150.分布式爬虫主要解决什么问题
151.写爬虫是用多进程好?还是多线程好? 为什么?
152.解析网页的解析器使用最多的是哪几个
153.需要登录的网页,如何解决同时限制 ip,cookie,session(其中有一些是动态生成的)在不使用动态爬取的情况下?
154.验证码的解决(简单的:对图像做处理后可以得到的,困难的:验证码是点击,拖动等动态进行的?)
155.使用最多的数据库(mysql,mongodb,redis 等),对他的理解?
网络编程
156.TCP 和 UDP 的区别?
157.简要介绍三次握手和四次挥手
158.什么是粘包? socket 中造成粘包的原因是什么? 哪些情况会发生粘包现象?
并发相关
159.举例说明 conccurent.future 的中线程池的用法
160.说一说多线程,多进程和协程的区别。
161.简述 GIL
全局解释器锁(Global Interpreter Lock),由于GIL的存在,python中的多线程并不能真正的并行执行。
即使在CPU多核环境,python中的多线程只能在一个CPU核心上执行,因为只有一个线程能持有GIL。
162.进程之间如何通信
163.IO多路复用的作用?
164.select、poll、epoll 模型的区别?
165.什么是并发和并行?
167.解释什么是异步非阻塞?
168.threading.local 的作用?
Git 面试题
169.说说你知道的 git 命令
git init: 初始化git代码库
git clone: 克隆代码仓库
git config: 配置
#增加/删除文件
git add [file1] : 添加文件得到暂存区
git add . : 添加当前目录的所有文件到暂存区
git rm [file1] : 删除工作区文件,并将这粗删除放入暂存区
git rm --cache [file] : 停止追踪制定文件,但改文件会保存在工作区
#代码提交
git commit
#分支
git branch
git checkout
git stash
git stash pop
git pull :下拉文件
git push : 推出
git remote :远程
git log : 显示日志
git status: 显示有变更的文件
170.git 如何查看某次提交修改的内容?
__END__