欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

值得收藏的10道python 面试题

程序员文章站 2022-12-04 12:28:17
q1:pep8是什么?python之禅(import this)是什么? 这题是考察你对编码规范的认识,无论是自己写代码还是在团队中写代码,了解并遵循代码规范是很基础的要...

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 面试题,希望对大家有所帮助