值得收藏的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实现带错误处理功能的远程文件读取方法
Apr 29 Python
Python模块搜索概念介绍及模块安装方法介绍
Jun 03 Python
Python利用字典将两个通讯录文本合并为一个文本实例
Jan 16 Python
Python遍历pandas数据方法总结
Feb 09 Python
pandas 对series和dataframe进行排序的实例
Jun 09 Python
Python用于学习重要算法的模块pygorithm实例浅析
Aug 16 Python
分享Python切分字符串的一个不错方法
Dec 14 Python
在Python中,不用while和for循环遍历列表的实例
Feb 20 Python
对Python 简单串口收发GUI界面的实例详解
Jun 12 Python
python障碍式期权定价公式
Jul 19 Python
jupyter notebook 调用环境中的Keras或者pytorch教程
Apr 14 Python
教你用Python+selenium搭建自动化测试环境
Jun 18 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数组函数序列 之array_count_values() 统计数组中所有值出现的次数函数
2011/10/29 PHP
PHP测试成功的邮件发送案例
2015/10/26 PHP
PHP JWT初识及其简单示例
2018/10/10 PHP
JS 实现完美include载入实现代码
2010/08/05 Javascript
javascript数字数组去重复项的实现代码
2010/12/30 Javascript
表单验证的完整应用案例探讨
2013/03/29 Javascript
JavaScript包装对象使用介绍
2013/08/29 Javascript
JS动态增删表格行的方法
2016/03/03 Javascript
jQuery的ajax下载blob文件
2016/07/21 Javascript
javascript实现瀑布流动态加载图片原理
2016/08/12 Javascript
js实现加载更多功能实例
2016/10/27 Javascript
JavaScript学习笔记之惰性函数示例详解
2017/08/27 Javascript
vue-router 导航钩子的具体使用方法
2017/08/31 Javascript
vue基于Element构建自定义树的示例代码
2017/09/19 Javascript
Vue项目部署在Spring Boot出现页面空白问题的解决方案
2018/11/26 Javascript
详解React服务端渲染从入门到精通
2019/03/28 Javascript
python实现类似ftp传输文件的网络程序示例
2014/04/08 Python
从零学python系列之浅谈pickle模块封装和拆封数据对象的方法
2014/05/23 Python
Python解析json之ValueError: Expecting property name enclosed in double quotes: line 1 column 2(char 1)
2017/07/06 Python
Python实现的人工神经网络算法示例【基于反向传播算法】
2017/11/11 Python
python实现图片处理和特征提取详解
2017/11/13 Python
python with提前退出遇到的坑与解决方案
2018/01/05 Python
Python使用sqlalchemy模块连接数据库操作示例
2019/03/13 Python
详解如何减少python内存的消耗
2019/08/09 Python
py-charm延长试用期限实例
2019/12/22 Python
如何利用python进行时间序列分析
2020/08/04 Python
python如何设置静态变量
2020/09/07 Python
Python3.7安装PyQt5 运行配置Pycharm的详细教程
2020/10/15 Python
PyTorch中的拷贝与就地操作详解
2020/12/09 Python
CSS类名支持中文命名的示例
2014/04/04 HTML / CSS
印刷工程专业应届生求职信
2013/09/29 职场文书
境外导游求职信
2014/02/27 职场文书
立春观后感
2015/06/18 职场文书
大学生奶茶店创业计划书
2019/06/25 职场文书
python opencv旋转图片的使用方法
2021/06/04 Python
千万级用户系统SQL调优实战分享
2022/03/03 MySQL