Python面试重点(进阶篇)

1.简述 OSI 7层模型及其作用?(2分)

(1)应用层:与其他计算机进行通讯的一个应用,它是对应应用程序的通信服务的。例如,一个没有通信功能的字处理程序就不能执行通信的代码,从事字处理工作的程序员也不关心OSI的第7层。但是,如果添加了一个传输文件的选项,那么字处理器的程序员就需要实现OSI的第7层。
(2)表示层:这一层的主要功能是定义数据格式及加密。例如,FTP允许你选择以二进制或ASII格式传输。如果选择二进制,那么发送方和接收方不改变文件的内容。如果选择ASII格式,发送方将把文本从发送方的字符集转换成标准的ASII后发送数据。在接收方将标准的ASII转换成接收方计算机的字符集。
(3)会话层:他定义了如何开始、控制和结束一个会话,包括对多个双向小时的控制和管理,以便在只完成连续消息的一部分时可以通知应用,从而使表示层看到的数据是连续的,在某些情况下,如果表示层收到了所有的数据,则用数据代表表示层。
(4)传输层:这层的功能包括是否选择差错恢复协议还是无差错恢复协议,及在同一主机上对不同应用的数据流的输入进行复用,还包括对收到的顺序不对的数据包的重新排序功能。
(5)网络层:这层对端到端的包传输进行定义,他定义了能够标识所有结点的逻辑地址,还定义了路由实现的方式和学习的方式。为了适应最大传输单元长度小于包长度的传输介质,网络层还定义了如何将一个包分解成更小的包的分段方法。
(6)数据链路层:他定义了在单个链路上如何传输数据。这些协议与被讨论的歌种介质有关。
(7)物理层:OSI的物理层规范是有关传输介质的特性标准,这些规范通常也参考了其他组织制定的标准。连接头、针、针的使用、电流、电流、编码及光调制等都属于各种物理层规范中的内容。物理层常用多个规范完成对所有细节的定义。
2.简述 TCP三次握手、四次挥手的流程。(3分) 

 

第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

  (1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
        (2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
        (3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
        (4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

3.TCP和UDP的区别?(3分)

tcp:上传下载\发邮件 可靠 面向连接 速度慢 能传递的数据长度不限    

udp:即时通讯工具 不可靠 面向数据报 速度快 能传递的数据长度有限


4.什么是黏包?(2分)

当多条消息发送时接受变成了一条或者出现接收不准确的情况。本质 : 发送的每一条数据之间没有边界

 

 

 

5.什么 B/S 和 C/S 架构?(2分)

 

c/s:

C:client 客户端

S:server 服务端

安全性 程序比较庞大

b/s:

B:browser 浏览器

S:server 服务端 

更节省资源 不用更新 不依赖环境

 

 

6.请实现一个简单的socket编程(客户端和服务端可以进行收发消息)(3分)

 

 

 

 

 

7.简述进程、线程、协程的区别?(3分)

进程是计算机资源分配的最小单位

线程是计算机可以被CPU调度的最小单位

一个进程中可以有多个线程,同一个进程中的线程可以共享此进程中的资源,一个进程中至少有一个线程(一个应用程序中至少有一个进程)

默认进程之间无法进行资源共享,如果主要想要通讯可以基于:文件/网络/Queue

资源开销小 协程是微线程

本质是一条线程 所以不能利用多核

由程序控制的,不是由操作系统调度的

gevent 第三方模块

协程能够识别的IO操作 : 网络操作 sleep

协程和cpython解释器下的线程有啥区别 :资源开销小 能够把单线程的效率提高 协程能够识别的io操作不如线程多

又叫微线程,是人为创建的

 

 

8.什么是GIL锁?(2分)

GIL(全局解释器锁):同一时刻保证一个进程中只有一个线程可以被cpu调度

 

 

 

9.进程之间如何进行通信?(2分)

进程之间通信 IPC
Inter Process Communication

 

 

10.Python如何使用线程池、进程池?(2分)

线程池:from concurrent.futures  import ThreadPoolExecutor 

进程池:from concurrent.futures import ProcessPoolExecutor

 

 

11.请通过yield关键字实现一个协程? (2分)

 

 

 

12.什么是异步非阻塞? (2分)

  • 同步:多个任务之间有先后顺序执行,一个执行完下个才能执行。
  • 异步:多个任务之间没有先后顺序,可以同时执行有时候一个任务可能要在必要的时候获取另一个同时执行的任务的结果,这个就叫回调!
  • 阻塞:如果卡住了调用者,调用者不能继续往下执行,就是说调用者阻塞了。
  • 非阻塞:如果不会卡住,可以继续执行,就是说非阻塞的。同步异步相对于多任务而言,阻塞非阻塞相对于代码执行而言。

 

 

13.什么是死锁?如何避免?(2分)

死锁现象 :交叉使用互斥(递归锁)锁

 

 

14.程序从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

大概1秒

 

 

15.程序从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

1秒

 

 

16.程序从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秒

 

 

17.读程序,请确认执行到最后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

 

 

18.读程序,请确认执行到最后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

 

19.MySQL常见数据库引擎及区别?(3分)

#innodb : 索引+数据 表结构 数据的持久化存储
# 事务 :一致性 n条语句的执行状态是一致的
# begin; # 开启事务
# select id from innot where id =1 for update;
# update innot set id = 2 where id = 1;
# commit; # 提交事务 解锁被锁住的数据,让他们能够被修改
# 行级锁 :只对涉及到修改的行加锁,利于并发的修改,但是对于一次性大量修改效率低下
# 表级锁 :一次性加一把锁就锁住了整张表,不利于并发的修改,但是加锁速度比行锁的效率要高
# 外键约束 :被约束表中的数据不能随意的修改/删除 约束字段据要根据被约束表来使用数据
# myisam : 索引 数据 表结构 数据的持久化存储
# 表级锁
# memory : 表结构
# 数据断电消失

20.简述事务及其特性? (3分)

数据库事务是指作为单个逻辑工作单元执行的一系列操作(SQL语句)

事务特性(4种):

原子性 (atomicity):强调事务的不可分割.
一致性 (consistency):事务的执行的前后数据的完整性保持一致.
隔离性 (isolation):一个事务执行的过程中,不应该受到其他事务的干扰
持久性(durability) :事务一旦结束,数据就持久到数据库

21.事务的隔离级别?(2分)

事务隔离级别 脏读 不可重复读 幻读
读未提交(read-uncommitted)
不可重复读(read-committed)
可重复读(repeatable-read)
串行化(serializable)

22.char和varchar的区别?(2分)

区别一,定长和变长
char 表示定长,长度固定,varchar表示变长,即长度可变。char如果插入的长度小于定义长度时,则用空格填充;varchar小于定义长度时,还是按实际长度存储,插入多长就存多长。

因为其长度固定,char的存取速度还是要比varchar要快得多,方便程序的存储与查找;但是char也为此付出的是空间的代价,因为其长度固定,所以会占据多余的空间,可谓是以空间换取时间效率。varchar则刚好相反,以时间换空间。

区别之二,存储的容量不同
对 char 来说,最多能存放的字符个数 255,和编码无关。
而 varchar 呢,最多能存放 65532 个字符。varchar的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是 65,532字节。

 

23.mysql中varchar与char的区别以及varchar(50)中的50代表的含义。(2分)

50代表最大长度为50字节

 

24.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触发器。

 

25.where子句中有a,b,c三个查询条件, 创建一个组合索引abc(a,b,c),以下哪种会命中索引(3分)

(a)
(b)
(c)
(a,b)
(b,c)
(a,c)
(a,b,c)

 

 

26.组合索引遵循什么原则才能命中索引?(2分)

 

 

27.列举MySQL常见的函数? (3分)

# count 统计
# max 最大值
# min 最小值
# avg 平均值
# sum 求和

 

 

28.MySQL数据库 导入、导出命令有哪些? (2分)

mysqldump -u root -p123  库名 > 文件名

mysqldump -u root -p123  库名 < 文件名

 

 

29.什么是SQL注入?(2分)

  SQL 注入是一种非常常见的数据库攻击手段,SQL 注入漏洞也是网络世界中最普遍的漏洞 之一

 

 

30.简述left join和inner join的区别?(2分)

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 

right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
inner join(等值连接) 只返回两个表中联结字段相等的行

 

 

31.SQL语句中having的作用?(2分)

过滤 having 

 

 

32.MySQL数据库中varchar和text最多能存储多少个字符?(2分)

 65535

33.MySQL的索引方式有几种?(3分)

 主键索引 唯一索引 普通索引 联合主键 联合唯一 联合普通

34.什么时候索引会失效?(有索引但无法命中索引)(3分)

 

 

35.数据库优化方案?(3分)

 

 

36.什么是MySQL慢日志?(2分)

 

 

37.设计表,关系如下: 教师, 班级, 学生, 科室。(4分) 科室与教师为一对多关系, 教师与班级为多对多关系, 班级与学生为一对多关系, 科室中需体现层级关系。

1. 写出各张表的逻辑字段
2. 根据上述关系表
  a.查询教师id=1的学生数
  b.查询科室id=3的下级部门数
  c.查询所带学生最多的教师的id

 

 



select count(*) from student s,class c,teacher t where s.cid=c.cid and c.cid = t.cid and tid=1; select count(*) from post where parent_id=3; select tid,count(*) as p from student s,class c,teacher t where s.cid=c.cid and c.cid = t.cid group by tid order by p limit 1;

 

38.有staff表,字段为主键Sid,姓名Sname,性别Sex(值为"男"或"女"),课程表Course,字段为主键Cid,课程名称Cname,关系表SC_Relation,字段为Student表主键Sid和Course表主键Cid,组成联合主键,请用SQL查询语句写出查询所有选"计算机"课程的男士的姓名。(3分)

 

select st.Sname form staff as st inner join SC_Relation as sc on st.Sid = sc.Sid where id in (select id form Course where Cname="计算机") having Sex=""
 

 

39.根据表关系写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

 

 

posted @ 2020-02-27 11:39  无我识心  阅读(309)  评论(0)    收藏  举报