Python面试重点(进阶篇)
注意:只有必答题部分计算分值,补充题不计算分值。
第一部分 必答题
-
简述 OSI 7层模型及其作用?(2分)
应用层
表示层
会话层
传输层————端口————TCP,UDP协议
网络层————路由器————ipv4,ipv6
数据链路层————mac,arp协议————网卡,交换机
物理层 -
简述 TCP三次握手、四次挥手的流程。(3分)
第一次握手:建立连接是,客户端发送SYN包到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到SYN包,必须确认客户的SYN,同时自己也发送一个SYN包,即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK,此包发送完完毕,客户端和服务器进入链接ESTABLISHED(TCP链接成功)状态,完成三次握手。
第一次挥手:客户端进程发出连接释放报文,并停止发送数据。
第二次挥手:服务器收到连接释放报文,发出确认报文。
第三次挥手:客户端收到服务器的确认请求后,等待服务端发送连接释放报文。
第四次挥手:客户端收到服务器的连接释放报文后,发出确认。 -
TCP和UDP的区别?(3分)
TCP协议:
需要两边先建立连接,在进行消息传递;
信息传递过程中不会丢失,可靠,速度慢,传递的数据长度不限。
UDP协议:
不需要建立连接就能进行通信,随时可以发送消息;
不可靠,速度快,面向数据报,传递的数据长度有限。 -
什么是黏包?(2分)
当多条消息发送时,接受变成了一条或者出现接受不准确的情况。
-
什么 是B/S 和 C/S 架构?(2分)
B/S:浏览器/服务器模式
C/S:客户端/服务器模式
C/S通常是建立在专用的网络上,小范围的网络环境;B/S是建立在广域网上的,适应范围强,通常有操作系统和浏览器就行;
C/S结构比B/S结构更安全,因为用户群相对固定,对信息的保护更强;
B/S结构维护升级比较简单,而C/S结构维护升级相对困难; -
请实现一个简单的socket编程(客户端和服务端可以进行收发消息)(3分)
# 客户端
import struct
import socket
sk = socket.socket()
def proto_recv():
len_msg = sk.recv(4)
len_msg = struct.unpack('i', len_msg)[0]
msg = sk.recv(len_msg)
return msg
sk.connect(('192.168.0.249',9001))
for i in range(1000000):2*i
msg1 = proto_recv()
print(msg1)
msg2 = proto_recv()
print(msg2)
# 服务端
import struct
import socket
def proto_send(msg):
msg = msg.encode('utf-8')
len_msg = len(msg)
proto_len = struct.pack('i', len_msg)
conn.send(proto_len)
conn.send(msg)
sk = socket.socket()
sk.bind(('192.168.0.249',9001))
sk.listen()
conn,addr = sk.accept()
msg1 = 'hello'
msg2 = 'world'
proto_send(msg1)
proto_send(msg2)
-
简述进程、线程、协程的区别?(3分)
进程是计算机资源分配的最小单位
线程是计算机中可以被CPU调度的最小单位
一个进程可以有多个线程,同一个进程中的线程可以共享此进程中的资源,一进程中至少有一个线程
进程和线程是计算机中真实存在的,协程是程序员人为创造出来的
协程又可以称为“微线程”,实际上是让一个线程轮番的去执行一些任务
单纯的协程不能提高并发,只是代码间来回切换 -
什么是GIL锁?(2分)
GIL锁:全局解释器锁,同一时刻保证一个进程中只有一个线程可以被CPU调度
-
进程之间如何进行通信?(2分)
通过文件/网络/Queue
-
Python如何使用线程池、进程池?(2分)
-
请通过yield关键字实现一个协程? (2分)
-
什么是异步非阻塞? (2分)
-
什么是死锁?如何避免?(2分)
死锁:Lock锁两次,多个锁交叉使用
-
程序从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 -
程序从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 -
程序从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分)
lnnoDB:用于事务处理应用程序,具有众多特性,包括ACID事务支持。
MyISAM:默认的MySQL插件式存储引擎,它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。
Memory:将所有数据保存在RAM中,在需要快速查找引用和其他类似数据的环境下,可提供极快的访问。 -
简述事务及其特性? (3分)
事务是访问并可能更新数据库中各种数据项的一个程序执行单元
恢复和并发控制的基本单位。
特性:原子性、一致性、隔离性、持久性。 -
事务的隔离级别?(2分)
读未提交
不可重复读
可重复读
串行化 -
char和varchar的区别?(2分)
定长 char(255)
变长 varchar(65535) 字节长度 -
mysql中varchar与char的区别以及varchar(50)中的50代表的含义。(2分)
-
MySQL中delete和truncate的区别?(2分)
delete:条件删除,delete可以带where,所以支持条件删除
truncate:删除表 -
where子句中有a,b,c三个查询条件, 创建一个组合索引abc(a,b,c),以下哪种会命中索引(3分)
(a)
(b)
(c)
(a,b)
(b,c)
(a,c)
(a,b,c) -
组合索引遵循什么原则才能命中索引?(2分)
-
列举MySQL常见的函数? (3分)
-
MySQL数据库 导入、导出命令有哪些? (2分)
-
什么是SQL注入?(2分)
-
简述left join和inner join的区别?(2分)
-
SQL语句中having的作用?(2分)
-
MySQL数据库中varchar和text最多能存储多少个字符?(2分)
-
MySQL的索引方式有几种?(3分)
-
什么时候索引会失效?(有索引但无法命中索引)(3分)
-
数据库优化方案?(3分)
-
什么是MySQL慢日志?(2分)
-
设计表,关系如下: 教师, 班级, 学生, 科室。(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分)
-
查询所有同学的学号、姓名、选课数、总成绩;
-
查询姓“李”的老师的个数;
-
查询平均成绩大于60分的同学的学号和平均成绩;
-
查询有课程成绩小于60分的同学的学号、姓名
-
删除学习“叶平”老师课的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 -