Python面试重点(进阶篇)
注意:只有必答题部分计算分值,补充题不计算分值。
第一部分 必答题
-
简述 OSI 7层模型及其作用?(2分)
物理层 数据链路层 网络层 传输层 会话层 表示层 应用层
-
简述 TCP三次握手、四次回收的流程。(3分)
建立连接
由客户端发起一个syn请求,服务端接收并回复(ack syn)
客户端收到ack和syn之后再回复一个ack确认
在原生的socket代码中三次握手是由accept connect
断开连接 客户端向服务端发起请求断开连接的请求 服务端向客户端确认请求 服务端向客户端发起断开连接请求 客户端向服务端确认断开请求
-
TCP和UDP的区别?(3分)
TCP协议 -可靠 面向连接 速度慢 传递长度无限 全双工 流式传输
UDP协议 -不可靠 面向无连接 数据报 速度快传递数据长度有限 一对一 一对多 多对多
-
什么是黏包?(2分)
当多条消息发送时接受变成了一条或者出现接受不准确的情况
-
什么 B/S 和 C/S 架构?(2分)
浏览器 服务端 只输入网址就可以使用
客户端 服务端
-
请实现一个简单的socket编程(客户端和服务端可以进行收发消息)(3分)
服务端 import socket sk = socket.socket() sk.bind(('127.0.0.1',8000)) sk.listen() conn,addr=sk.accept() mesg= conn.recv(1024).decode('utf-8') print(mesg) sonn.close() sk.close()
客户端 import socket sk = socket.socket() sk.connect(('127.0.0.1',8000)) mesg= sk.send('hello world'.encode('utf-8'))sk.close()
-
简述进程、线程、协程的区别?(3分)
都可以提高并发能力 进程计算机中分配资源的最小单位,线程cpu可调度的最小单位 实际上是让一个线程轮番去执行一些任务协程又可以称为 微线程,是基于代码认为创造出来的,进程和线程是计算机中真实存在的 一个线程中可以创建多个协程
-
什么是GIL锁?(2分)
全局解释器锁
同一时刻保证一个进程中只有一个线程可以被CPU调度
-
进程之间如何进行通信?(2分)
IPC
-
Python如何使用线程池、进程池?(2分)
线程池
from concurrent.futures import ThreadPoolExecutor
import time
def task(n1,n2):
time.sleep(2)
print('任务')
return 666
pool = ThreadPoolExecutor(10)
num = int(input(">>>"))
for i in range(num):
pool.submit(task,i,1)
pool.shutdown(True)
print('end')
ret = pool.map(task,range(1,20))
print('end',ret)
pool.shutdown(True)
for item in ret:
print(item)进程池
from concurrent.futures import ProcessPoolExecutor
import time
def task(n1,n2):
time.sleep(2)
print('任务')
return 666
pool = ProcessPoolExecutor(10)
num = int(input(">>>"))
for i in range(num):
pool.submit(task,i,1) -
请通过yield关键字实现一个协程? (2分)
-
什么是异步非阻塞? (2分)
遇到阻塞不等待程序继续执行
-
什么是死锁?如何避免?(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
0 -
程序从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
60 -
读程序,请确认执行到最后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()
0 -
读程序,请确认执行到最后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()不一定为0
-
MySQL常见数据库引擎及区别?(3分)
-
简述事务及其特性? (3分)
事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性
原子性,一致性,隔离性,持久性
-
事务的隔离级别?(2分)
读未提交 读提交 重复读 串行
-
char和varchar的区别?(2分)
char是一种固定长度的类型 空间换时间
varchar则是一种可变长度的类型 时间换空间
-
mysql中varchar与char的区别以及varchar(50)中的50代表的含义。(2分)
varchar最大长度50 char一个字符占50
-
MySQL中delete和truncate的区别?(2分)
delete删除一条数据 truncate删除所有数据
-
where子句中有a,b,c三个查询条件, 创建一个组合索引abc(a,b,c),以下哪种会命中索引(3分)
(a)
(b)
(c)
(a,b)
(b,c)
(a,c)
(a,b,c) 1 -
组合索引遵循什么原则才能命中索引?(2分)
对创建索引的列筛选效率高
区分度小 不适合创建索引
查询范围大 慢 小快
多个条件用and相连
-
列举MySQL常见的函数? (3分)
concat() 拼接
group_concat() 打印分组下字段全部信息
regexp 正则匹配
abs() 返回绝对值
avg() 平均值
max() 最大值
min() 最小值
sum() 求和
insert() 插入MySQL数据库 导入、导出命令有哪些? (2分)
-
导出整个数据库: mysqldump -u username -p password 库名> dbname.sql ;
连接 source sql文件
导入
mysql --default-character-set=utf8 -u root -p 名 <news.sql
-
什么是SQL注入?(2分)
将sql代码添加到输入参数中,传递到sql服务器解析并执行
-
简述left join和inner join的区别?(2分)
左连接 内连接
-
SQL语句中having的作用?(2分)
过滤出来符合条件的数据
-
MySQL数据库中varchar和text最多能存储多少个字符?(2分)
65535
-
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,最高分,最低分;
-
查询每门课程被选修的学生数;
-
查询出只选修了一门课程的全部学生的学号和姓名;
-
查询选修“杨艳”老师所授课程的学生中,成绩最高的学生姓名及其成绩;
-
查询两门以上不及格课程的同学的学号及其平均成绩;
-