附答案 | 最强Python面试题之Python开发第三弹
写在之前
大家好呀,我是帅蛋。
这里是帅蛋的【最强Python面试题】系列,Python 面试八股文都在这里啦~
今天依然是 Python 后台开发面试题之Django 专题,大家一定要记得点赞收藏呀!!!
欢迎和帅蛋聊一聊~扣扣2群:609771600,获取最新秋招信息 & 内推进度,日常聊聊迷茫吹吹牛皮,抱团取暖
顺便提一句,我所有和面试相关的内容都会放在#帅蛋的面试空间# 中,大家可以关注下这个话题~
我会尽我最大的努力帮助到大家哒!!!
面试认准
主要内容
这些面试题是我结合自己的经验整理的,主要就是下面这 5 个专题:
- Python 基础面试题
- Python 进阶
- Python 后台开发
- 爬虫
- 机器学习
已完成
Python 基础题
- 附答案 | 最强Python面试题之Python基础题(1)
- 附答案 | 最强Python面试题之Python基础题(2)
- 附答案 | 最强Python面试题之Python基础题(3)
- 附答案 | 最强Python面试题之Python基础题(4)
Python 进阶题
- 附答案 | 最强Python面试题之Python进阶题第一弹
- 附答案 | 最强Python面试题之Python进阶题第二弹
- 附答案 | 最强Python面试题之Python进阶题第三弹
- 附答案 | 最强Python面试题之Python进阶题第四弹
更新中
Python 后台开发
对每道面试题我都会附带详细的答案,有些我觉得重要的内容会详细讲解,虽然是面试八股文,我还是希望大家不是只“知其然”,更得“知其所以然”。
关于更新频率,每天我会更新 10 道题左右,总共会有差不多 200 道。
无论是准备面试还是自己学习,这份面试题绝对值得你去看,去学习。
大家可以关注我,再关注我,使劲关注我,不要错过每天的更新~
以下是正文
Python 后台开发面试题第三弹,大家一定要记得点赞收藏,一起加油!
1、Python 中 Django、Flask、Tornado 三大框架各自的应用场景?
Django
主要是用来搞快速开发的,他的亮点就是快速开发,节约成本,正常的并发量不过 10000,如果要实现高并发的话,就要对 Django 进行二次开发,比如把整个笨重的框架给拆掉,自己写 socket 实现 http 的通信,底层用纯 c/c++写提升效率,ORM 框架给干掉,自己编写封装与数据库交互的框架,因为啥呢,ORM 虽然面向对象来操作数据库,但是它的效率很低,使用外键来联系表与表之间的查询
Flask
轻量级,主要是用来写接口的一个框架,实现前后端分离,提升开发效率,Flask 本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展 Flask-Mail,用户认证 Flask-Login),都需要用第三方的扩展来实现。比如可以用 Flask-extension 加入 ORM、窗体验证工具,文件上传、身份验证等。Flask 没有默认使用的数据库,你可以选择 MySQL,也可以用 NoSQL。
其 WSGI 工具箱采用 Werkzeug(路由模块),模板引擎则使用 Jinja2。这两个也是 Flask 框架的核心。Python 最出名的框架要数 Django,此外还有 Flask、Tornado 等框架。虽然 Flask 不是最出名的框架,但是 Flask 应该算是最灵活的框架之一,这也是 Flask 受到广大开发者喜爱的原因。
Tornado
Tornado 是一种 Web 服务器软件的开源版本。
Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,因此 Tornado 是实时 Web 服务的一个 理想框架。
2、django 如何提升性能?
对一个后端开发程序员来说,提升性能指标主要有两个一个是并发数,另一个是响应时间网站性能的优化一般包括 web 前端性能优化,应用服务器性能优化,存储服务器优化。
对前端的优化主要有:
(1) 减少 http 请求,减少数据库的访问量,比如使用雪碧图。
(2)使用浏览器缓存,将一些常用的 css,js,logo 图标,这些静态资源缓存到本地浏览器,通过设置 http 头中的 cache-control 和 expires 的属性,可设定浏览器缓存,缓存时间可以自定义。
(3) 对 html,css,javascript 文件进行压缩,减少网络的通信量。
对我个人而言,我做的优化主要是以下三个方面:
(1)合理的使用缓存技术,对一些常用到的动态数据,比如首页做一个缓存,或者某些常用的数据做个缓存,设置一定得过期时间,这样减少了对数据库的压力,提升网站性能。
(2) 使用 celery 消息队列,将耗时的操作扔到队列里,让 worker 去监听队列里的任务,实现异步操
作,比如发邮件,发短信。
(3) 就是代码上的一些优化,补充:nginx 部署项目也是项目优化,可以配置合适的配置参数,提升效率,增加并发量。
(4) 如果太多考虑安全因素,服务器磁盘用固态硬盘读写,远远大于机械硬盘,这个技术现在没有普及,主要是固态硬盘技术上还不是完全成熟, 相信以后会大量普及。
(5) 另外还可以搭建服务器集群,将并发访问请求,分散到多台服务器上处理。
(6) 最后就是运维工作人员的一些性能优化技术了。
3、什么是 restful api,谈谈你的理解?
REST:Representational State Transfer 的缩写,翻译:“具象状态传输”。一般解释为“表现层状态转换”。
REST 是设计风格而不是标准。是指客户端和服务器的交互形式。我们需要关注的重点是如何设计 REST 风格的网络接口。
REST 的特点:
(1) 具象的。一般指表现层,要表现的对象就是资源。比如,客户端访问服务器,获取的数据就是资源。比如文字、图片、音视频等。
(2) 表现:资源的表现形式。txt 格式、html 格式、json 格式、jpg 格式等。浏览器通过 URL 确定资源的位置,但是需要在 HTTP 请求头中,用 Accept 和 Content-Type 字段指定,这两个字段是对资源表现的描述。
(3) 状态转换:客户端和服务器交互的过程。在这个过程中,一定会有数据和状态的转化,这种转化叫做状态转换。其中,GET 表示获取资源,POST 表示新建资源,PUT 表示更新资源,DELETE 表示删除资源。HTTP 协议中最常用的就是这四种操作方式。
RESTful 架构:
(1) 每个 URL 代表一种资源
(2) 客户端和服务器之间,传递这种资源的某种表现层
(3) 客户端通过四个 http 动词,对服务器资源进行操作,实现表现层状态转换
4、启动 Django 服务的方法?
runserver 方法是调试 Django 时经常用到的运行方式,它使用 Django 自带的 WSGI Server 运
行,主要在测试和开发中使用,并且 runserver 开启的方式也是单进程 。
5、怎样测试 django 框架中的代码?
在单元测试方面,Django 继承 python 的 unittest.TestCase 实现了自己的 django.test.TestCase,编写测试用例通常从这里开始。测试代码通常位于 app 的 tests.py 文件中(也可以在 models.py 中编写,一般不建议)。在 Django 生成的 depotapp 中,已经包含了这个文件,并且其中包含了一个测试
用例的样例:
python manage.py test:执行所有的测试用例 python manage.py test app_name, 执行该 app 的所有测试用例 python manage.py test app_name.case_name: 执行指定的测试用例
一些测试工具:unittest 或者 pytest
6、有过部署经验?用的什么技术?可以满足多少压力?
(1) 有部署经验,在阿里云服务器上部署的
(2) 技术有:nginx + uwsgi 的方式来部署 Django 项目
(3) 无标准答案(例:压力测试一两千)
7、Django 中哪里用到了线程?哪里用到了协程?哪里用到了进程?
(1) Django 中耗时的任务用一个进程或者线程来执行,比如发邮件,使用 celery。
(2) 部署 django 项目的时候,配置文件中设置了进程和协程的相关配置。
8、django 关闭浏览器,怎样清除 cookies 和 session?
设置 Cookie
1. def cookie_set(request): 2. response = HttpResponse("<h1>设置 Cookie,请查看响应报文头</h1>") 3. response.set_cookie('h1', 'hello django') 4. return response
读取 Cookie
1. def cookie_get(request): 2. response = HttpResponse("读取 Cookie,数据如下:<br>") 3. if request.COOKIES.has_key('h1'): 4. response.write('<h1>' + request.COOKIES['h1'] + '</h1>') 5. return response
以键值对的格式写会话。
1. request.session['键']=值
根据键读取值。
1. request.session.get('键',默认值)
清除所有会话,在存储中删除值部分。
1. request.session.clear()
清除会话数据,在存储中删除会话的整条数据。
1. request.session.flush()
删除会话中的指定键及值,在存储中只删除某个键及对应的值。
1. del request.session['键']
设置会话的超时时间,如果没有指定过期时间则两个星期后过期。
如果 value 是一个整数,会话将在 value 秒没有活动后过期。
如果 value 为 0,那么用户会话的 Cookie 将在用户的浏览器关闭时过期。
如果 value 为 None,那么会话永不过期。
1. request.session.set_expiry(value)
Session 依赖于 Cookie,如果浏览器不能保存 cookie 那么 session 就失效了。因为它需要浏览器的 cookie 值去 session 里做对比。session 就是用来在服务器端保存用户的会话状态。
cookie 可以有过期时间,这样浏览器就知道什么时候可以删除 cookie 了。 如果 cookie 没有设置过期时间,当用户关闭浏览器的时候,cookie 就自动过期了。你可以改变 SESSION_EXPIRE_AT_BROWSER_CLOSE 的设置来控制 session 框架的这一行为。缺省情况下,SESSION_EXPIRE_AT_BROWSER_CLOSE 设置为 False ,这样,会话 cookie 可以在用户浏览器中保持有效达 SESSION_COOKIE_AGE 秒(缺省设置是两周,即 1,209,600 秒)如果你不想用户每次打开浏览器都必须重新登陆的话,用这个参数来帮你。如果 SESSION_EXPIRE_AT_BROWSER_CLOSE 设置为 True,当浏览器关闭时,Django 会使 cookie 失效。
SESSION_COOKIE_AGE:设置 cookie 在浏览器中存活的时间。
9、代码优化从哪些方面考虑?有什么想法?
1、优化算法时间
算法的时间复杂度对程序的执行效率影响最大,在 Python 中可以通过选择合适的数据结构来优化时间复杂度,如 list 和 set 查找某一个元素的时间复杂度分别是 O(n)和 O(1)。不同的场景有不同的
优化方式,总得来说,一般有分治,分支界限,贪心,动态规划等思想。
2、循环优化
每种编程语言都会强调需要优化循环。当使用 Python 的时候,你可以依靠大量的技巧使得循环运行得更快。然而,开发者经常漏掉的一个方法是:
避免在一个循环中使用点操作。每一次你调用方法 str.upper,Python 都会求该方法的值。然而,如果你用一个变量代替求得的值,值就变成了已知的,Python 就可以更快地执行任务。优化循环的关键,是要减少 Python 在循环内部执行的工作量,因为 Python 原生的解释器在那种情况下,真的会减缓执行的速度。(注意:优化循环的方法有很多,这只是其中的一个。例如,许多程序员都会说,列表推导是在循环中提高执行速度的最好方式。这里的关键是,优化循环是程序取得更高的执行速度的更好方式之一。)
3、函数选择
在循环的时候使用 xrange 而不是 range;使用 xrange 可以节省大量的系统内存,因为 xrange() 在序列中每次调用只产生一个整数元素。而 range()將直接返回完整的元素列表,用于循环时会有不必要的开销。在 python3 中 xrange 不再存在,里面 range 提供一个可以遍历任意长度的范围的 iterator。
4、并行编程
因为 GIL 的存在,Python 很难充分利用多核 CPU 的优势。但是,可以通过内置的模 multiprocessing 实现下面几种并行模式:
多进程:对于 CPU 密集型的程序,可以使用 multiprocessing 的 Process,Pool 等封装好的类,通过多进程的方式实现并行计算。但是因为进程中的通信成本比较大,对于进程之间需要大量数据交互的程序效率未必有大的提高。
多线程:对于 IO 密集型的程序,multiprocessing.dummy 模块使用 multiprocessing 的接口封装 threading,使得多线程编程也变得非常轻松(比如可以使用 Pool 的 map 接口,简洁高效)。
布式:multiprocessing 中的 Managers 类提供了可以在不同进程之共享数据的方式,可以在此基础上开发出分布式的程序。
不同的业务场景可以选择其中的一种或几种的组合实现程序性能的优化。
5、使用性能分析工具
除了上面在 ipython 使用到的 timeit 模块,还有 cProfile。cProfile 的使用方式也非常简单:python-mcProfilefilename.py,filename.py 是要运行程序的文件名,可以在标准输出中看到每一个函数被调用的次数和运行的时间,从而找到程序的性能瓶颈,然后可以有针对性地优化。
6、set 的用法
set 的 union,intersection,difference 操作要比 list 的迭代要快。因此如果涉及到求 list 交集,并集或者差的问题可以转换为 set 来操作。
7、PyPy
PyPy 是用 RPython(CPython 的子集)实现的 Python,根据官网的基准测试数据,它比 CPython 实现的 Python 要快 6 倍以上。快的原因是使用了 Just-in-Time(JIT)编译器,即动态编译器,与静态编译器(如 gcc,javac 等)不同,它是利用程序运行的过程的数据进行优化。由于历史原因,目前 pypy 中还保留着 GIL,不过正在进行的 STM 项目试图将 PyPy 变成没有 GIL 的 Python。如果 python 程序中含有 C 扩展(非 cffi 的方式),JIT 的优化效果会大打折扣,甚至比 CPython 慢(比 Numpy)。
所以在 PyPy 中最好用纯 Python 或使用 cffi 扩展。
10、Django 中间件是如何使用的?
中间件不用继承自任何类(可以继承 object),下面一个中间件大概的样子:
class CommonMiddleware(object): def process_request(self, request): return None def process_response(self, request, response): return response
还有 process_view, process_exception 和 process_template_response 函数。
(1) 初始化:无需任何参数,服务器响应第一个请求的时候调用一次,用于确定是否启用当前中间件。
def __init__(self): pass
(2) 处理请求前:在每个请求上,request 对象产生之后,url 匹配之前调用,返回 None 或HttpResponse 对象。
def process_request(self, request): pass
(3) 处理视图前:在每个请求上,url 匹配之后,视图函数调用之前调用,返回 None 或HttpResponse 对象。
def process_view(self, request, view_func, *view_args,**view_kwargs): pass
(4) 处理响应后:视图函数调用之后,所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse 对象。
def process_response(self, request, response): pass
(5) 异常处理:当视图抛出异常时调用,在每个请求上调用,返回一个 HttpResponse 对象。
def process_exception(self, request,exception): pass
以上就是今天的内容,我是帅蛋,我们明天见~
❤️ 欢迎关注我,有问题,找帅蛋,我最看不得别人迷茫!
❤️ 如果你觉得有帮助,希望爱学习的你不要吝啬三连击哟[点赞 + 收藏 + 评论]~
#帅蛋的面试空间##面试八股文##秋招##Python##python面试#还有小小公众号 【编程文青李狗蛋】,聊聊迷茫吹吹牛皮~