值得收藏的10道python 面试题


Posted in Python onApril 15, 2019

Q1:PEP8是什么?Python之禅(import this)是什么?

这题是考察你对编码规范的认识,无论是自己写代码还是在团队中写代码,了解并遵循代码规范是很基础的要求。企业中在提交代码后都会有对应的工具来对代码进行检查,比如 pep8、flake8、pylint 等,但是 PEP 8 是什么一定要了解。

即 Style Guide for Python Code(Python编码风格指南)。如果面试时不知道什么是 PEP 8 ,那聊起来想必不会很愉快。速战速决的面试,如果不是你把面试官“秒杀”了,那就是面试官把你“秒杀”了,大部分是后者。 Python 之禅,也就是 import this。这属于对 Python 文化的了解了。什么意思?你去 Python shell 里执行一下:import this,然后搜索下答案自然就出来了。

Q2:Python常用的容器类型有哪些以及它们之间的差别?

这是一道基础题。如果被问到了这个问题,说明面试官在探测你对 Python 基础的掌握。如果不知道,那就会被“秒杀”。当然聊得好了,也可以聊到实现原理层面。

在 Python 中常用的数据类型,有一些是基础数据类型,比如 int、bool、string,还有容器类型,比如 list、set、dict 等。所有的类型又可以氛分为:可变类型和不可变类型(不知道是什么的可以动手搜索一下)。单说容器类型,每种容器类型都有使用的场景,比如 list 可以存放不同类型的元素,特点是支持索引和切片操作,支持 insert 和 pop 操作,属于可变类型。由此也可以展开很多面试题中遇到的坑,比如说这个代码:

值得收藏的10道python 面试题

例子

然后再来说到 tuple,也可以当做列表,支持迭代、索引、切片等操作,但因为它是不可变类型,所以不支持 append、insert 等操作,为什么不支持呢?在从应用上来说,在实际编程中经常会用到它,比如:参数传递,解包。这一部分可以继续聊下去的就是namedtuple。再然后就是 set 和 dict,它们跟 list 和 tuple有这么几个差别:1. 存放的值不是顺序的;2. 无法通过索引获取到数据; 3. 存放的元素不可重复,并且必须是 hashable(可哈希的),针对 key 来说;4. 更快的查找速度,因为是通过哈希表来存储的。当然还可以继续深入 set 和 dict 的原理,如何解决哈希碰撞。

Q3:解释下闭包是什么,以及日常中什么场景会用到?

闭包是指持有了自由变量的函数,那怎么理解呢,用代码来看一下:

值得收藏的10道python 面试题

闭包

日常使用场景是什么呢?最常用会用到的地方就是装饰器,上面的示例代码也能看出来,比如我曾写过 Cache 的演进部分,部分代码如下:

值得收藏的10道python 面试题

这就是个典型的场景。

Q4:GIL 是什么?它的影响和具体原理是什么?

GIL:Global Interpreter Lock(全局解释器锁)。具体表现就是:在一个进程中,同一时刻只能有一个线程能到解释器,为什么只能有一个线程拿到解释器呢?因为在 CPython 中,内存管理不是线性安全的,所以,为了避免多个线程同时访问到一个对象,就有了这么一个锁。顺带着也提到了线程安全的概念,有了 GIL 了,那么 Python 中有哪些类型是线程安全的呢?哪些不是呢?又是一个新的问题。那么 GIL 的影响是什么呢?就是同一时刻只有一个线程在真实执行,对于 CPU 密集型的应用影响比较大,对于 IO 密集型的应用影响没那么大。当然还可以具体展开来说。

Q5:进程、协程、线程分别是什么,以及区别是什么?

从操作系统角度来讲,进程是资源分配单元,线程是执行单元,多个线程可以共享所在进程的资源。而协程是从程序运行角度来叫,是由用户(程序)控制和调度的一个过程,在 Python 中,协程是一个包含了 yield 的函数,比如下图:

值得收藏的10道python 面试题

协程(包含一个生成器)

在Python 3里面你可以用asyncio.iscoroutine(coro) 来判断是否为协程。需要了解的是在协程执行时,是通过 event loop 来调度的。如果聊到这,可能会接着聊下 Tornado 的 IOLoop 的事。总体来说,协程可以理解为更轻量级的线程,能够在单线程中运行多个协程。需要注意的是,在 Python 中协程执行是串行的,这个是由于它的调度机制决定的,这点不同于 Golang。

Q6:如何理解 Django 被称为 MTV 模式?

如果是我来问这个问题,这个题就是面向对象设计和设计模式的开始。简单来说大家耳熟能详的模式叫: MVC。说是 Model View Controller,而在 Django 中因为 Template 来处理视图展现,所以称为: MTV。接下里会问到的就是分层的概念,有句话叫:“没有什么问题是不能通过增加一层解决的,如果有,那就再加一层。”当然还会有设计模式的一些原则等着你,比如开-闭原则、单一职责原则等。

Q7:解释下什么是 ORM 以及它的优缺点是什么?

ORM:Object Relational Mapping(对象关系映射),它做的事就是帮我们封装一下对数据库的操作,避免我们来写不太好维护的 SQL 代码。优点就是让我们写的代码更容易维护,因为里面不用夹杂着各种 SQL 代码。缺点是失去了 SQL 的灵活,并且越是通用的 ORM 框架,性能损耗会越大。

说到性能损耗,可以接着聊的是 Django 中的 raw sql,也就是说Model.objects.raw这个方法的使用,它的作用、原理、性能提升等。还可以继续聊另外一个老生常谈的问题:N+1 的问题。

Q8:如何排查 Django 系统中的性能问题?

对于 Django 这样一个非常成熟的框架来说,丰富的周边能够让我们快速的找到别人开源出来的优秀插件,比如说 Django-debug-toolbar,或者是 Django-silk 。但是一个基础问题是:在 Django 的 settings 中,设置DEBUG = True 和 DEBUG = False 的差别是什么?还可以聊的是对于 Django 处理请求到返回响应的具体流程。因为只有熟悉了整体流程,才能在合理的位置进行排查。比方说,当我们判断可能是数据库的问题时,那可能需要在 Model 层的某个方法上加上执行时间监测的逻辑。如果是 View 层的其他逻辑导致的,可能会在 Middleware 上增加执行时间监测的逻辑。

Q9:Django 系统中如何配置数据库的长连接?

这涉及到 Django 如何处理数据库连接细节的问题。默认情况下对于每一个请求 Django 都会建立一个新的数据库连接。这意味着当请求量过大时就会出现数据库(MySQL)的 Too many connection 的问题,对于这个问题,在其他的语言框架中有连接池这样的东西来减少数据库的连接数,来提升连接的使用效率。而在 Django 中,为了处理这一问题,增加了一个配置: CONN_MAX_AGE,在 settings 的 DATABASES 配置中。配置了该选项后,Django 会跟数据库保持链接(时长取决于 CONN_MAX_AGE 设定的值 ),不再会针对每个请求都创建新的连接了。但是需要注意的是,这跟数据库连接池的概念还不太一样。

Q10:如何部署并监控 Django 系统?

这个就是考察候选人对于真实项目的部署和线上问题排查的了解了。如果没有真实工作过,可能不太有概念。首先需要理解的是开发的流程,代码在程序员的电脑(开发机)上开发完成,然后部署到测试环境进行测试,这个过程可能是自动的(由 GitLab CI 触发或者其他类似逻辑),也可能是需要人工操作的(比如使用 Fabric 或者 ansible)手动执行部署操作。然后测试同学进行测试,没问题之后,代码合并到主分支(涉及Git相关的使用流程),再部署上线。

这时系统就可以对外提供服务了,那么问题来了,用户的访问是如何到你部署的系统中来的?再来说监控。监控的目的是为了保证程序的正常运行,如果出现问题我们可以及时发现并修复。所以,简单来说有两个确定的指标可以观察,第一个是状态码,对于 HTTP 服务来说,监控非 200 的状态码的数量是很有必要的;第二个就是应用内的异常监控,这个就是 Sentry 之类的系统来做了,通过它可以收集到具体的异常详情,完成的 Traceback,可以帮助我们快速地定位问题所在。

虽然说只有十个问题,但是在正式聊的时候,每个问题都是可以层层追问的,其实面试有个原则,就是:要追问到候选人答不出来,或者面试官不知道该问什么为止,因为需要确定候选人的技术掌握的边界(深度)。

总结

以上所述是小编给大家介绍的值得收藏的10道python 面试题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Python编写屏幕截图程序方法
Feb 18 Python
python定时检查某个进程是否已经关闭的方法
May 20 Python
Python模块搜索概念介绍及模块安装方法介绍
Jun 03 Python
Python实现的破解字符串找茬游戏算法示例
Sep 25 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
Jul 25 Python
Python 普通最小二乘法(OLS)进行多项式拟合的方法
Dec 29 Python
python3使用matplotlib绘制散点图
Mar 19 Python
详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?
May 07 Python
django 通过url实现简单的权限控制的例子
Aug 16 Python
Python基于wordcloud及jieba实现中国地图词云图
Jun 09 Python
五种Python转义表示法
Nov 27 Python
Python的collections模块真的很好用
Mar 01 Python
Python 学习教程之networkx
Apr 15 #Python
Python OS模块实例详解
Apr 15 #Python
Python日期时间Time模块实例详解
Apr 15 #Python
Python3.6中Twisted模块安装的问题与解决
Apr 15 #Python
python使用BeautifulSoup与正则表达式爬取时光网不同地区top100电影并对比
Apr 15 #Python
Python Datetime模块和Calendar模块用法实例分析
Apr 15 #Python
Python如何处理大数据?3个技巧效率提升攻略(推荐)
Apr 15 #Python
You might like
php 获取全局变量的代码
2011/04/21 PHP
关于php程序报date()警告的处理(date_default_timezone_set)
2013/10/22 PHP
php preg_replace替换实例讲解
2013/11/04 PHP
PHP判断手机是IOS还是Android
2015/12/09 PHP
PHP实现的限制IP投票程序IP来源分析
2016/05/04 PHP
PHP中for循环与foreach的区别
2017/03/06 PHP
php删除一个路径下的所有文件夹和文件的方法
2018/02/07 PHP
PHP addslashes()函数讲解
2019/02/03 PHP
Asp.net下利用Jquery Ajax实现用户注册检测(验证用户名是否存)
2010/09/12 Javascript
ASP.NET jQuery 实例5 (显示CheckBoxList成员选中的内容)
2012/01/13 Javascript
instanceof和typeof运算符的区别详解
2014/01/06 Javascript
JS中怎样判断undefined(比较不错的方法)
2014/03/27 Javascript
动态读取JSON解析键值对的方法
2014/06/03 Javascript
javascript模拟实现ajax加载框实例
2014/10/15 Javascript
javascript中Object使用详解
2015/01/26 Javascript
jQuery内部原理和实现方式浅析
2015/02/03 Javascript
基于BootStrap Metronic开发框架经验小结【三】下拉列表Select2插件的使用
2016/05/12 Javascript
Ext JS框架程序中阻止键盘触发回退或者刷新页面的代码分享
2016/06/07 Javascript
JS使用cookie实现只出现一次的广告代码效果
2017/04/22 Javascript
基于JS代码实现简单易用的倒计时 x 天 x 时 x 分 x 秒效果
2017/07/13 Javascript
最适应的vue.js的form提交涉及多种插件【推荐】
2018/08/27 Javascript
angularJS实现不同视图同步刷新详解
2018/10/09 Javascript
小程序测试后台服务的方法(ngrok)
2019/03/08 Javascript
Element-UI中关于table表格的那些骚操作(小结)
2019/08/15 Javascript
微信小程序将页面按钮悬浮固定在底部的实现代码
2020/10/29 Javascript
[50:04]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第二局
2016/02/28 DOTA
python基于multiprocessing的多进程创建方法
2015/06/04 Python
教大家使用Python SqlAlchemy
2016/02/12 Python
python ftp 按目录结构上传下载的实现代码
2018/09/12 Python
英国和爱尔兰最大的地毯零售商:Kukoon
2018/12/17 全球购物
党员群众路线承诺书
2014/05/20 职场文书
学校安全防火方案
2014/06/07 职场文书
五一促销活动总结
2014/07/01 职场文书
初中英语教师个人工作总结2015
2015/07/21 职场文书
严以修身专题学习研讨会发言材料
2015/11/09 职场文书
详解JVM系列之内存模型
2021/06/10 Javascript