Python面试重点(进阶篇)
注意:只有必答题部分计算分值,补充题不计算分值。
第一部分 必答题
简述 OSI 7层模型及其作用?(2分)
应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 为了实现计算机系统的互联。
简述 TCP三次握手、四次回收的流程。(3分)
三次握手: 1. 客户端向服务器请求建立连接通道 发送(syn=1 seq=x) 2. 服务端同意请求并申请向客户端建立连接通道 发送(ack=1+x syn=1 seq=x) 3. 客户端同意请求 发送(ack=1+x) 四次挥手: 1. 客户端向服务器请求断开连接通道 发送(fin=1 seq=y) 2. 服务端同意请求 发送(ack=1+y) 3. 服务端向客户端请求断开连接通道 发送(fin=1 seq=y) 4. 客户端同意请求 发送(ack=1+y)
TCP和UDP的区别?(3分)
1.tcp面向连接 udp是无连接的,即发送数据之前不需要建立连接 2.tcp提供可靠的服务,通过tcp连接传送的数据,无差错,不丢失,不重复,且按序到达;而udp是尽最大努力交付,即不保证可靠交付 3.udp具有较好的实时性,工作效率比tcp高,适用于对高速传输和实时性有较高的通信或广播通信。 4.每一条tcp连接只能是点对点的;udp支持一对一,一对多,多对和多对多的交互通信。 5.tcp对系统资源要求较高,udp对系统资源要求较少。
什么是黏包?(2分)
多个数据包被连续存储于连续的缓存中,在对数据包进行读取时由于无法确定发生方的发送边界,而采用某一估测值大小来进行数据读出,若双方的size不一致时就会使指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。
什么 B/S 和 C/S 架构?(2分)
B/S: 基于浏览器和服务器之间的通信 browser C/S: 基于客户端和服务器之间的通信 client
请实现一个简单的socket编程(客户端和服务端可以进行收发消息)(3分)
# server 文件 import socket sk = socket.socket() sk.bind(('192.168.12.44', 9001)) # 绑定一个地址 ip+端口 sk.listen() # 开始监听客户端的请求 conn,addr = sk.accept() # 接受一个连接请求 print(addr) conn.send(b'hello world') conn.close() sk.close() # client 文件 import socket sk = socket.socket() sk.connect(('192.168.12.44', 9001)) msg = sk.recv(1024) print(msg) sk.close()
简述进程、线程、协程的区别?(3分)
1. 进程,协程,线程的区别:三个都可以提高并发 进程是计算机中资源分配的最小单位,线程是计算机中cpu可调度的最小单位: 协程 又称为 '微线程' 是基于代码创造的,而进程和线程是真是存在的,一个进程可以有多个线程,一个线程可以创建多个协程 2. 计算密集型------使用多进程 3. IO密集型-------使用多线程/协程+IO切换
什么是GIL锁?(2分)
GIL锁:全局解释器锁 一个时间点只有一个线程处于执行状态
进程之间如何进行通信?(2分)
1.共享内存 通过mmap模块实现 2.信号 3.通过Queue队列 4.通过Pipe管道 5.通过socket
Python如何使用线程池、进程池?(2分)
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor import os,time,random from multiprocessing import Pool def task(n): print('%s is runing' %os.getpid()) time.sleep(random.randint(1,3)) return n**2 if __name__ == '__main__': # 多进程方式一 pool2=Pool() pool2.map(task,range(10)) # 多进程方式二,下面这种多进程和多线程的用法一模一样 executor=ThreadPoolExecutor(max_workers=3) futures=[] for i in range(11): future=executor.submit(task,i) futures.append(future) executor.shutdown(True) print('+++>') for future in futures: print(future.result())
请通过yield关键字实现一个协程? (2分)
def consumer(): r = '' while True: n = yield r if n is None: return print('[CONSUMER] Consuming %s...' % n) r = '200 OK' def produce(c): c.send(None) n = 0 while n < 5: n = n + 1 print('[PRODUCER] Producing %s...' % n) r = c.send(n) print('[PRODUCER] Consumer return: %s' % r) c.close() c = consumer() produce(c)
什么是异步非阻塞? (2分)
同步和异步: 同步:就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。 异步:当一个异步过程调用发出后,调用者不会立刻得到结果。实际处理这个调用的部件是在调用发出 后,通过状态、通知来通知调用者,或通过回调函数处理这个调用。 阻塞和非阻塞 阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。 非阻塞:指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。 阻塞,非阻塞:进程/线程要访问的数据是否就绪,进程/线程是否需要等待; 同步,异步:访问数据的方式,同步需要主动读写数据,在读写数据的过程中还是会阻塞;异步只需要I/O操 作完成的通知,并不主动读写数据,由操作系统内核完成数据的读写。
什么是死锁?如何避免?(2分)
死锁的产生原因? 系统资源的竞争 进程运行推进顺序不当 解决死锁 加锁顺序:线程按照一定的顺序加锁 加锁时限:线程尝试获取锁的时候加上一定的时限,超过时限,则放弃对该锁的请求,并释放自己占有的锁。 死锁检测
程序从flag a执行到falg b的时间大致是多少秒?(2分)
import threading import time def _wait(): time.sleep(60) # flag a t = threading.Thread(target=_wait) t.setDeamon(False) t.start() # flag b 60多一点
程序从flag a执行到falg b的时间大致是多少秒?(2分)
import threading import time def _wait(): time.sleep(60) # flag a t = threading.Thread(target=_wait) t.setDeamon(True) t.start() # flag b 60
程序从flag a执行到falg b的时间大致是多少秒?(2分)
import threading import time def _wait(): time.sleep(60) # flag a t = threading.Thread(target=_wait) t.start() t.join() # flag b
读程序,请确认执行到最后number是否一定为0(2分)
import threading loop = int(1E7) def _add(loop:int = 1): global number for _ in range(loop): number += 1 def _sub(loop:int = 1): global number for _ in range(loop): number -= 1 number = 0 ta = threading.Thread(target=_add,args=(loop,)) ts = threading.Thread(target=_sub,args=(loop,)) ta.start() ta.join() ts.start() ts.join()
读程序,请确认执行到最后number是否一定为0(2分)
import threading loop = int(1E7) def _add(loop:int = 1): global number for _ in range(loop): number += 1 def _sub(loop:int = 1): global number for _ in range(loop): number -= 1 number = 0 ta = threading.Thread(target=_add,args=(loop,)) ts = threading.Thread(target=_sub,args=(loop,)) ta.start() ts.start() ta.join() ts.join()
MySQL常见数据库引擎及区别?(3分)
1.InnoDB:用于事务处理应用程序,具有众多特性,包括ACID事务支持。(提供行级锁) 2.MyISAM:默认的MySQL插件式存储引擎,它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。注意,通过更改STORAGE_ENGINE配置变量,能够方便地更改MySQL服务器的默认存储引擎。 3.Memory:将所有数据保存再RAM中
简述事务及其特性? (3分)
1.事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位 2.事务具有4个特性:原子性、一致性、隔离性和持续性。 1.原子性:事务是数据库的逻辑工作单位,事务中包括的诸操作要么都做,要么都不做。 2.一致性:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。 3.隔离性:一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰。 4.持续性:持续性也称永久性,指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其执行结果有任何影响。
事务的隔离级别?(2分)
char和varchar的区别?(2分)
**char:**定长,简单粗暴,浪费空间,存取速度快,范围0-255(字节) **varchar:**变长,精准,节省空间,存取速度慢,范围0-65535(字节)
mysql中varchar与char的区别以及varchar(50)中的50代表的含义。(2分)
**char:**定长,简单粗暴,浪费空间,存取速度快,范围0-255(字节) **varchar:**变长,精准,节省空间,存取速度慢,范围0-65535(字节) varchar(50) 定义一个长度为50的字符串
MySQL中delete和truncate的区别?(2分)
一、灵活性:delete可以条件删除数据,而truncate只能删除表的所有数据; delete from table_test where ... truncate table table_test 二、效率:delete效率低于truncate,delete是一行一行地删除,truncate会重建表结构, 三、事务:truncate是DDL语句,需要drop权限,因此会隐式提交,不能够rollback;delete是DML语句,可以使用rollback回滚。 四、触发器:truncate 不能触发任何Delete触发器;而delete可以触发delete触发器。
where子句中有a,b,c三个查询条件, 创建一个组合索引abc(a,b,c),以下哪种会命中索引(3分)
(a) (b) (c) (a,b) (b,c) (a,c) (a,b,c)
组合索引遵循什么原则才能命中索引?(2分)
列举MySQL常见的函数? (3分)
ABS(x):返回x的绝对值 MAX():最大值 MIN():最小值 COUNT():返回值的个数 AVG():返回平均值 SUM():求和
MySQL数据库 导入、导出命令有哪些? (2分)
导出(mysqldump) 导出数据和表结构 mysqldump -uroot -p dbname > dbname .sql 只导出表结构 mysqldump -uroot -p -d dbname > dbname .sql 导入 mysql -u用户名 -p密码 数据库名 < 数据库名.sql
什么是SQL注入?(2分)
通俗点讲,SQL注入的根本原因是: "用户输入数据"意外变成了代码被执行
简述left join和inner join的区别?(2分)
左连接和右连接很相似,只是左右表位置的不同罢了。 left join(左连接) 返回包括左表中的所有记录和右表中连接字段相等的记录 right join(右连接) 返回包括右表中的所有记录和左表中连接字段相等的记录
SQL语句中having的作用?(2分)
进行筛选条件
MySQL数据库中varchar和text最多能存储多少个字符?(2分)
varchar: 65535
MySQL的索引方式有几种?(3分)
普通索引:仅加速查询 唯一索引:加速查询 + 列值唯一(可以有null) 主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个 组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并 全文索引:对文本的内容进行分词,进行搜索
什么时候索引会失效?(有索引但无法命中索引)(3分)
数据库优化方案?(3分)
1.减少数据访问-创建并正确使用索引 2.返回更少的数据 1.数据分页处理 2.只返回需要的字段 3.减少交互次数 1.使用存储过程 2.优化业务逻辑 4.减少服务器的cpu运算 1.使用绑定变量 2.合理使用排序 3.减少比较操作 4.大量复杂运算在客户端处理 5.利用更多资源 1.客户端多进程访问 2.数据库并行处理
什么是MySQL慢日志?(2分)
MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。
设计表,关系如下: 教师, 班级, 学生, 科室。(4分)
科室与教师为一对多关系, 教师与班级为多对多关系, 班级与学生为一对多关系, 科室中需体现层级关系。1. 写出各张表的逻辑字段 2. 根据上述关系表 a.查询教师id=1的学生数 b.查询科室id=3的下级部门数 c.查询所带学生最多的教师的id
有staff表,字段为主键Sid,姓名Sname,性别Sex(值为"男"或"女"),课程表Course,字段为主键Cid,课程名称Cname,关系表SC_Relation,字段为Student表主键Sid和Course表主键Cid,组成联合主键,请用SQL查询语句写出查询所有选"计算机"课程的男士的姓名。(3分)
根据表关系写SQL语句(10分)
- 查询所有同学的学号、姓名、选课数、总成绩;
- select sid,sname,
- 查询姓“李”的老师的个数;
- select count(tname) from teacher where tname like '李%';
- 查询平均成绩大于60分的同学的学号和平均成绩;
- select student_id,avg(num) as a from score group by student_id having a > 60;
- 查询有课程成绩小于60分的同学的学号、姓名
- select
- 删除学习“叶平”老师课的score表记录;
- 查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;
- 查询每门课程被选修的学生数;
- 查询出只选修了一门课程的全部学生的学号和姓名;
- 查询选修“杨艳”老师所授课程的学生中,成绩最高的学生姓名及其成绩;
- 查询两门以上不及格课程的同学的学号及其平均成绩;
第二部分 补充题
什么是IO多路复用?
async/await关键字的作用?
MySQL的执行计划的作用?
简述MySQL触发器、函数、视图、存储过程?
数据库中有表:t_tade_date
id tade_date 1 2018-1-2 2 2018-1-26 3 2018-2-8 4 2018-5-6 ... 输出每个月最后一天的ID