python 面试题

Python Web 面试题 PQ21-9-13

记录一下9月13日面试Python Wbe 面试题,从基础、Django、mysql和linux这四个方向

1. 请说python常用数据类型

​   字典dict、集合set、列表list、元祖tuple、字符串str

2. 如何一行代码去除列表重复项
data = [1,2,3,4,5,1,2,3,4,5,'a','v','a']
print(list(set(data)))
3. 列表常用方法
 		1. list.extend(iter) 将可迭代对象中的元素追加到列表;
        2. list.append(data) 列表末尾追加数据 ***最常用方法之一**;
        3. 列表.insert(index,data) 在指定位置插入数据;
        4. 列表[index] 取值 [起止位置:结束位置:间隔];
      	5. del 列表[index] 删除指定索引数据;
        6. 列表.remove(data) 删除第一个出现的指定数据;
        7. 列表.pop() 删除末尾数据,返回值:被删除的元素;
        8. 列表.pop(index) 删除指定索引数据,返回值:被删除的元素;
        9. 列表.clear() 清空列表元素。
4. 如果将列表排序

​   列表.sort() 升序排序,从小到大;

​   列表.sort(reverse=True):降序排序,从大到小;

​   列表.reverse() 列表逆序、反转。

5. 字典是否有序?

​   python版本3.6之前无序,在3.6以后有序

6. 如何将两个字典合并
a = {
    1: 3,
    2: 4
}
b = {
    4: 6,
    7: 8
}
# 方法一
# a.update(b)
# 方法二
for x, y in b.items():
    a[x] = y
7. 什么是线程?什么是进程?什么是协程?(几乎没有面试不问的)

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

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

​   协程:是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。

8. 多线程与多进程适用场景?

​   多进程适合在 CPU 密集型操作(cpu 操作指令比较多,如位数多的浮点运算)。

​   多线程适合在 IO 密集型操作(读写数据操作较多的,比如爬虫)。

9. CPU密集型和IO密集型适用场景?

​   IO密集型:大部分的状况是 CPU 在等 I/O (硬盘/内存)的读/写

​   CPU密集型:大部份时间用来做计算、逻辑判断等 CPU 动作的程序称之 CPU 密集型。

10. 线程是并发还是并行,进程是并发还是并行?

​   线程是并发,进程是并行;

11. 如何理解并发和并行?并说出相应的库

​   并行:同一时刻多个任务同时在运行,库为multiprocessing;

​   并发:在同一时间间隔内多个任务都在运行,但是并不会在同一时刻同时运行,存在交替执行的情况,库为threading。

12. 什么是可变数据类型?什么是不可变数据类型?

​   可变不可变指的是内存中的值是否可以被改变,不可变类型指的是对象所在内存块里面的值不可以变,有数值、字符串、元组;可变类型则是可以改变,主要有列表、字典。

13. 写一下单例模式
# 单例模式
class Dan:
    __dan = None
    def __new__(cls, *args, **kwargs):
        if cls.__dan == None:
            cls.__dan = object.__new__(cls)
            return cls.__dan
        else:
            return cls.__dan
14. 锁有几种?优缺点是什么?

​   互斥锁、可重入锁

​   好处:

​   确保了某段关键代码(共享数据资源)只能由一个线程从头到尾完整地执行能解决多线程资源竞争下的原子 操作问题。

​   坏处:

​   阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大地下降了

15. 知道死锁什么吗?如何避免?

​   若干子线程在系统资源竞争时,都在等待对方对某部分资源解除占用状态,结果是谁也不愿先解锁,互相干等着,程序无法执行下去,这就是死锁。

​   避免死锁使用GIL 锁 全局解释器锁,限制多线程同时执行,保证同一时间只有一个线程执行

16. 写一下冒泡排序
def bubbleSort(nums):
for x in range(len(nums)):
    for j in range(len(nums) - x -1):
        if nums[j] > nums[j+1]:
            nums[j],nums[j+1] = nums[j+1],nums[j]
return nums
17. 如果一个函数装饰多个装饰器他们执行顺序
	1. 离着函数最近先开始,自内而外的执行;

 	2. 在执行时,由外而内,一层层执行
def wrapper1(f1):
    print('外1')
    def inner1(*args,**kwargs):
        print('内11')
        ret = f1(*args,**kwargs)
        print('内12')
        return ret
    return inner1

def wrapper2(f2):
    print('外2')
    def inner2(*args,**kwargs):
        print('内21')
        ret = f2(*args,**kwargs)
        print('内22')
        return ret
    return inner2

def wrapper3(f3):
    print('外3')
    def inner3(*args,**kwargs):
        print('内31')
        ret = f3(*args,**kwargs)
        print('内32')
        return ret
    return inner3

@wrapper1
@wrapper2
@wrapper3
def func():
    print('我是函数')
func()
结果:
	外1
	内11
	内21
	内31
	我是函数
	内32
	内22
	内12

Django 基础

1. 什么是Restful API?

​   REST:Representational State Transfer 的缩写,翻译:“具象状态传输”。一般解释为“表现层状态转换”。

​   REST 是设计风格而不是标准。是指客户端和服务器的交互形式。我们需要关注的重点是如何设计REST 风格的网络接口。

​   RESTful 架构:

​   1.每个 URL 代表一种资源;

​   2.客户端和服务器之间,传递这种资源的某种表现层;

​   3.客户端通过四个 http 动词,对服务器资源进行操作,实现表现层状态转换。

2. 状态码都有哪些?

​   100-199:表示服务器成功接收部分请求,要求客户端继续提交其余请求才能完成整个处理过程。

​   200-299:表示服务器成功接收请求并已完成处理过程。

​   300-399:为完成请求,客户需要进一步细化请求,重定向。

​   304、307(使用缓存资源)。

​   400-499:客户端请求有错误,常用 404(服务器无法找到被请求页面), 403(服务器拒绝访问,权限不够)。

​   500-599:服务器端出现错误

3.常用中间件有哪些?

​   处理请求前: process_request

​   处理视图前:process_view

​   处理模板响应前:process_template_response

​   处理响应后:process_response

​   异常处理:process_exception

4. DRF是什么?

​   Django REST framework 是一个强大而灵活的 Web API 工具,常用的有APIview可以用于实现CBV(类处理请求)

​   RESTful 架构:

​   1.每个 URL 代表一种资源;

​   2.客户端和服务器之间,传递这种资源的某种表现层;

​   3.客户端通过四个 http 动词,对服务器资源进行操作,实现表现层状态转换。

5. 介绍一下celery

​   Celery是python开发一个分布式任务队列框架,主要可以将耗时的程序放到 celery 中执行。

​   主要组件:

​   任务下发:可以理解为比较耗时的任务;

​   消息中间件:需要执行的任务加入到队列中,常用RabbitMQ和redis;

​   消费任务:经过队列下发的任务进行执行与处理;

​   存储:将执行完的任务进行存储。

6. django的生命周期是什么

​   url请求->nginx服务器->uWSGI服务器->中间件->url路由匹配->view视图匹配->ORM操作获取数据->返回给view->中间件->uWSGI服务器->nginx服务器->前端渲染数据

7. session和cookie的区别

​   1、cookie 数据存放在客户的浏览器上,session 数据放在服务器上

​   2、cookie 不是很安全,别人可以分析存放在本地的 cookie 并进行 cookie 欺骗考虑到安全应当使用 session

​   3、session 会在一定时间内保存在服务器上。当访问增多,会比较占用服务器的性能考虑到减轻服务器性能方面,应当使用 cookie

​   4、单个 cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存 20 个 cookie

​   5、建议: 将登陆信息等重要信息存放为 SESSION 其他信息如果需要保留,可以放在 cookie 中

8. 简述MVT模式

​   model 负责与数据库交互,进行数据处理

​   view 接收请求,视图处理后返回应答

​   template 负责封装构造返回页面

9. token和JWT的区别

​   使用token方式, token必须存放在服务端的数据库里, 且每一次认证的时候都需要去查询一次数据, 会对数据库性能造成一点影响, 但能及时的管理用户token,而jwt 不需要服务端储存,用户登陆的信息关键存放在jwt加密数据,只需要在登录成功之后, 将jwt返回给客户端, 客户端请求数据的时候携带jwt即可, 认证函数在拿到jwt后只需要解密,解密成功后即认证成功, 对数据库服务器没有影响,jwt更适合安全级别较低的服务器设计,这种服务允许不严格的登陆授权,即使密文丢失也不会造成用户的严重损失,却能获得较高的服务器性能。

10. Redis在Django中可以用来做什么?
	1. 可利用Redis消息队列功能作为Celery的中间件
 	2. 可以用于Django缓存。
    3. 可以进行数据存储
11. Redis 常用数据类型

​   list、set、sort set、String、Hash

Mysql

1. 多表添加索引有些注意事项?

​   单表 加索引 避免where <>的变量建立索引

​   双表 加索引 相反加

​   三表 加索引 最好设置再经常查询的字段中

2. 数据库优化有哪些方法?

​   1.优化索引、SQL 语句、分析慢查询;

​   2.设计表的时候严格根据数据库的设计范式来设计数据库;

​   3.使用缓存,把经常访问到的数据而且不需要经常变化的数据放在缓存中,能节约磁盘 IO

​   4.优化硬件;采用 SSD,使用磁盘队列技术(RAID0,RAID1,RDID5)等

​   5.采用 MySQL 内部自带的表分区技术,把数据分层不同的文件,能够提高磁盘的读取效率;

​   6.垂直分表;把一些不经常读的数据放在一张表里,节约磁盘 I/O;

​   7.主从分离读写;采用主从复制把数据库的读操作和写入操作分离开来;

​   8.分库分表分机器(数据量特别大),主要的的原理就是数据路由;

​   9.选择合适的表引擎,参数上的优化

​   10.进行架构级别的缓存,静态化和分布式;

​   11.不采用全文索引;

​   12.采用更快的存储方式,例如 NoSQL 存储经常访问的数据

3. 常用有哪些引擎?他们的主要区别?

​   常用是MyISAMInnoDB

​   区别:如下

​   InnoDB 支持事务,MyISAM 不支持

​   InnoDB 适合频繁修改以及涉及到安全性较高的应用,MyISAM 适合查询以及插入为主的应用

​   InnoDB 支持外键,MyISAM 不支持

​   InnoDB 需要指定,MyISAM 是默认引擎

​   InnoDB 不支持 FULLTEXT 类型的索引

​   InnoDB 中不保存表的行数

​   InnoDB 支持行锁

4. 一条sql语句中执行顺序是什么?

​ from->on->join->where->group by->having->select->order by-limit

5. mysql的四大特性

​ 原子性、持久性、一致性和隔离性

6. 你会在性别这个字段创建索引吗?为什么?

​   不会

​   只有两种取值的字段,建了索引数据库也不一定会用,只会白白增加索引维护的额外开销,因为索引也是需要存储的,所以插入和更新的写入操作,同时需要插入和更新你这个字段的索引的

linux命令

1. 说出linux常用命令

​   cd、ls、pwd、wc、mv、tar、find、grep、netstat、ps、top、chown、Ping、touch等

2. 查看某个服务端口

​   netstat -anp |grep 服务名

3. 简单说下find与grep区别

​   grep 是查找匹配条件的行,find 是搜索匹配条件的文件

4. 日志文件一般在哪个目录下

​   /var/log

5. 假如一个sh脚本需要定期执行,你会怎么做?

​   使用crontab命令,将定期需要执行脚本加入到任务中即可。





DouTingHao
  手动整理不易,点个赞
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值