python面试第二部分_Python面试重点(进阶篇)

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

应用层、

表示层、

会话层、

传输层、端口 UDP TCP 四层交换机 四层路由器

网络层、ipv4 ipv6协议 路由器 三层交换机

数据链路层、mac arp协议 网卡 (二层)交换机

物理层

简述 TCP三次握手、四次回收的流程。(3分)

第一次:客户端发送初始序号x和syn=1请求标志

第二次:服务器发送请求标志syn,发送确认标志ACK,发送自己的序号seq=y,发送客户端的确认序号ack=x+1

第三次:客户端发送ACK确认号,发送自己的序号seq=x+1,发送对方的确认号ack=y+1

第一次挥手:客户端发出释放FIN=1,自己序列号seq=u,进入FIN-WAIT-1状态

第二次挥手:服务器收到客户端的后,发出ACK=1确认标志和客户端的确认号ack=u+1,自己的序列号seq=v,进入CLOSE-WAIT状态

第三次挥手:客户端收到服务器确认结果后,进入FIN-WAIT-2状态。此时服务器发送释放FIN=1信号,确认标志ACK=1,确认序号ack=u+1,自己序号seq=w,服务器进入LAST-ACK(最后确认态)

第四次挥手:客户端收到回复后,发送确认ACK=1,ack=w+1,自己的seq=u+1,客户端进入TIME-WAIT(时间等待)。客户端经过2个最长报文段寿命后,客户端CLOSE;服务器收到确认后,立刻进入CLOSE状态。

TCP和UDP的区别?(3分)

TCP是面向连接的,UDP是无连接的,TCP提供可靠的服务,也就是说,通过TCP连接传输的数据不会丢失,没有重复,并且按顺序到达,UDP没有可靠性。TCP是面向字节流的,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的。

什么是黏包?(2分)

当多条消息发送时接受变成了一条或者出现接收不准确的情况

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

C:client 客户端

S:server 服务端

B:browser 浏览器

S:server 服务端

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

import socket

sk = socket.socket()

sk.bind(('0.0.0.0',9001))

sk.listen()

conn,addr = sk.accept()

conn.send(b"hello")

import socket

sk = socket.socket()

sk.connect(('0.0.0.0',9001))

msg = sk.recv(1024)

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

进程:一个运行的程序(代码)就是一个进程,没有运行的代码叫程序,进程是系统资源分配的最小单位,进程拥有自己独立的内存空间,所以进程间数据不共享,开销大。

线程: 调度执行的最小单位,也叫执行路径,不能独立存在,依赖进程存在一个进程至少有一个线程,叫主线程,而多个线程共享内存(数据共享,共享全局变量),从而极大地提高了程序的运行效率。

协程:是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。 协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。

什么是GIL锁?(2分)

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

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

Queue和Pipe这两种方式,Queue用于多个进程间实现通信,Pipe是两个进程的通信

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

from concurrent.futures import ThreadPoolExecutor

from concurrent.futures import ProcessPoolExecutor

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

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

在此种模式下,用户进程只需要发起一个IO操作然后立即返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作,因为真正的IO读取或者写入操作已经由内核完成了。

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

2个线程互相等待对方的锁,互相占用着资源不释放。

为程序中的每一个锁分配一个唯一的id,然后只允许按照升序规则来使用多个锁

程序从flag a执行到falg b的时间大致是多少秒?(2分) 1

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分)1

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分) 60

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分) 一定为0

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分)

InnoDB、MyISAM和MEMORY

1、事务安全:

InnoDB支持事务安全,MyISAM和MEMORY两个不支持。

2、存储限制:

InnoDB有64TB的存储限制,MyISAM和MEMORY要是具体情况而定。

3、空间使用:

InnoDB对空间使用程度较高,MyISAM和MEMORY对空间使用程度较低。

4、内存使用:

InnoDB和MEMORY对内存使用程度较高,MyISAM对内存使用程度较低。

5、插入数据的速度:

InnoDB插入数据的速度较低,MyISAM和MEMORY插入数据的速度较高。

6、对外键的支持:

InnoDB对外键支持情况较好,MyISAM和MEMORY两个不支持外键。

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

事务应该具有4个属性:原子性、一致性、隔离性、持续性。

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

一个事务的执行不能被其他事务干扰。

char和varchar的区别?(2分)

char的存取数度还是要比varchar要快得多,因为其长度固定,方便程序的存储与查找;但是char也为此付出的是空间的代价,因为其长度固定,所以难免会有多余的空格占位符占据空间,可谓是以空间换取时间效率,而varchar是以空间效率为首位的

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

char所占的长度依然为10,除了字符‘’外,后面用空格补全

而varchar就立马把长度变为数据长度了

MySQL中delete和truncate的区别?(2分)

delete可以条件删除数据,而truncate只能删除表的所有数据

delete效率低于truncate,delete是一行一行地删除,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分)

count() max() min() sum() avg()

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

mysqldump -u用户名 -p 数据库名 > 数据库名.sql

mysql -u用户名 -p 数据库名 < 数据库名.sql

什么是SQL注入?(2分)

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

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

left join以左表为准

inner join 选两张表都有的

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

过滤筛选

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

varchar(100),指的是100字符

一个TEXT列,最大长度为65535个字符

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

FULLTEXT,HASH,BTREE,RTREE

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

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

1、选取最适用的字段属性

2、使用连接(JOIN)来代替子查询(Sub-Queries)

3、使用外键

4、使用索引

5、优化查询语句

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

mysql的慢查询日志是msyql提供的一种日志记录,它用来记录在msyql中响应时间超过阀值的语句,具体指运行时间超过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 sname,sid,count(*),sum(number) from student inner join score on sid = student_id group by sutdent_id;

查询姓“李”的老师的个数;

select count(*) from teacher where tname like "李%";

查询平均成绩大于60分的同学的学号和平均成绩;

select student_id,avg(number) from score group by student_id having avg(number) > 60;

查询有课程成绩小于60分的同学的学号、姓名

select sid,sname from student where sid = (select student_id from score having number > 60);

删除学习“叶平”老师课的score表记录;

select cid from teacher inner join course on tid = teacher_id where tanme = "叶平"

查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;

查询每门课程被选修的学生数;

查询出只选修了一门课程的全部学生的学号和姓名;

查询选修“杨艳”老师所授课程的学生中,成绩最高的学生姓名及其成绩;

查询两门以上不及格课程的同学的学号及其平均成绩;

你可能感兴趣的:(python面试第二部分)