面试

Python面试重点(进阶篇)

注意:只有必答题部分计算分值,补充题不计算分值。

第一部分 必答题

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

    应用层 表示层 会话层 传输层 网络层 数据链路层 物理层

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

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

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

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

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

    数据与数据之间没有明显的边界

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

    B/S:百度,淘宝,码云

    C/S:微信,浏览器 英雄联盟

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

    from socket import socket,SOCK_DGRAM

    sk = socket(type=SOCK_DGRAM) server_addr = ('127.0.0.1',9001)

    while True: msg = input('>>>') if msg.upper() == 'Q': break sk.sendto(msg.encode('utf-8'),server_addr) msg = sk.recv(1024) print(msg.decode('utf-8'))

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

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

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

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

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

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

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

    利用IPC进行

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

     

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

     

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

    用户进程触发io操作以后开始做自己的事情读取或者写入方法立即返回

  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

60s

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

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

0~1s

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

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

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

    InnoDB 
    支持事务支持外键
    支持表锁、行锁(for update)
    表锁:select * from tb for update
    行锁:select id,name from tb where id=2 for update

    myisam
    查询速度快
    全文索引
    支持表锁
    表锁:select * from tb for update
  2. 简述事务及其特性? (3分)

    事物用于将某些操作的多个sql作为原子性操作,一旦有某一个出现错误,即可回滚到原来状态,从而保证数据库完整性

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

    大多数数据库默认的事务隔离级别是Read committed,比如Sql Server , Oracle。Mysql的默认隔离级别是Repeatable read。

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

    char可变,varchar不可变

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

    char可变,varchar不可变

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

    delete操作完之后如果没有提交事务可以回滚,truncate不可以回滚

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

    (a)
    (b)
    (c)
    (a,b)
    (b,c)
    (a,c)
    (a,b,c)
  8. 组合索引遵循什么原则才能命中索引?(2分)

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

    concat

    max

    min

    avg

    sum

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

    数据库导入:

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

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

     

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

    过滤

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

    varchar100个

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

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

    存在空值

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

    1,,使用索引

    2,sql语句优化

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

    mysql的慢查询日志是msyql提供的一种日志记录,它用来记录在msyql中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的sql,则会被记录到慢查询日志中。

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

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

    看看

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

  21. 根据表关系写SQL语句(10分)

     

    • 查询所有同学的学号、姓名、选课数、总成绩;

    • selsct sid,sname,from student

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

    • select tname form teacher where tname like ‘’李%‘’

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

    • select class——id

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

    • select

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

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

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

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

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

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

  1. 什么是IO多路复用?

    其实就是整个函数对外表现为阻塞式的,也就是我们调用这个函数,如果条件达不到一定
    会被阻塞;但是其实内部并不是阻塞的,而是以一种非阻塞的方式工作的,内部能够实现
    自动轮询,如果有任何一个IO设备达到条件即可返回到应用层
  2. async/await关键字的作用?

    一、async/await的优点

    1)方便级联调用:即调用依次发生的场景;

    2)同步代码编写方式: Promise使用then函数进行链式调用,一直点点点,是一种从左向右的横向写法;async/await从上到下,顺序执行,就像写同步代码一样,更符合代码编写习惯;

    3)多个参数传递: Promise的then函数只能传递一个参数,虽然可以通过包装成对象来传递多个参数,但是会导致传递冗余信息,频繁的解析又重新组合参数,比较麻烦;async/await没有这个限制,可以当做普通的局部变量来处理,用let或者const定义的块级变量想怎么用就怎么用,想定义几个就定义几个,完全没有限制,也没有冗余工作;

    4)同步代码和异步代码可以一起编写: 使用Promise的时候最好将同步代码和异步代码放在不同的then节点中,这样结构更加清晰;async/await整个书写习惯都是同步的,不需要纠结同步和异步的区别,当然,异步过程需要包装成一个Promise对象放在await关键字后面;

    5)基于协程: Promise是根据函数式编程的范式,对异步过程进行了一层封装,async/await基于协程的机制,是真正的“保存上下文,控制权切换……控制权恢复,取回上下文”这种机制,是对异步过程更精确的一种描述;

    6)async/await是对Promise的优化: async/await是基于Promise的,是进一步的一种优化,不过在写代码时,Promise本身的API出现得很少,很接近同步代码的写法
  3. MySQL的执行计划的作用?

    1.查看mysql执行计划
    2.执行计划包含的信息
  4. 简述MySQL触发器、函数、视图、存储过程?

    触发器

    (1)触发器是一个特殊的存储过程,它是MySQL在insert、update、delete的时候自动执行的代码块。

    (2)触发器必须定义在特定的表上。

    (3)自动执行,不能直接调用,



    函数

    它跟php或js中的函数几乎一样:需要先定义,然后调用(使用)。

    只是规定,这个函数,必须要返回数据——要有返回值


    视图

    视图只是一种逻辑对象,是一种虚拟表,它并不是物理对象,因为视图不占物理存储空间,在视图中被查询的表称为视图的基表,大多数的select语句都可以用在创建视图中(说白了,视图就是一种虚拟表,就像是一张电子照片)

    优点:集中用户使用的数据,掩码数据的复杂性,简化权限管理以及为向其他应用程序输出而重新组织数据等

    存储过程

    存储过程(procedure),概念类似于函数,就是把一段代码封装起来,当要执行这一段代码的时候,可以通过调用该存储过程来实现。在封装的语句体里面,可以同if/else ,case,while等控制结构,可以进行sql编程,查看现有的存储过程。
  5. 数据库中有表: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:37  甄py  阅读(100)  评论(0)    收藏  举报