![b650e30b9e60d6d4f2faf57d2ca2d356.png](https://i-blog.csdnimg.cn/blog_migrate/6eb413a6f16ef5af66bb73c1cec38067.png)
醒来有人说我刁难面试者, 我来解释一下, 我的面试环节一般是最后一个环节才会进行 python 基础的面试. 之前都是项目交流, 进入到最后这个环节的, 都是我认为项目 OK 的, 我对他的能力也是认可的.
再说说这几道题:
- 前两道, with 语句和 __enter__ __exit__ 其实问的都是上下文管理, 但凡用过 python 的 open 打开过文件, 都会涉及到 with 语句. 而且, 90% 的 python 入门教程都会对 with 语句进行讲解. 我认为这个题并不是很偏.
- 至于 __init__ __new__, 但凡用过 python 的 oop 编程, 都是无法回避的问题, 很多面试题也会问这两个问题, 非常基础的问题.
- 函数定义的方法, 这道题我只要求答出 lambda 表达式就行了, 你只要听说过, 就能答出来. 我也没有对 lambda 表达式的细节进行发问.
- 接下来的私有成员变量, 这个在 C++ 中是个基础到不能再基础的问题, 如果是 C++ 面试中没能答出来, 我甚至都不想继续提问了. 但是为什么到了 python 这全军覆没了. 确实值得人深思. 至于如何从外部访问私有成员变量, 确实有点偏, 但是这个题我没有问出来.
- 再就是 dict 的查询时间复杂度和最坏时间复杂度, 这个其实是跟 python 无关的问题, 而是基础的数据结构问题, 也是很基础的问题. 我被面试的时候就被问到 C++ 中 stl 的 map 实现原理, 我不认为这道题很偏.
- for else 语句的考点, 这个是看开发者写 python 是否地道, 也就是我们常说的 pythonic. 如果答不上来, 你说用个 flag 标记, 我也是认为可以的.
- 然后是对闭包的灵魂四问. 这里只有第三问很偏, 其他的都很基础. 我发现开发者对于概念都非常清楚, 但是我想知道的是, 开发者在开发过程中有用到闭包吗? 或者他理解 python 对于闭包是怎么处理的吗?
- type 和 isinstance, 这里考的还是 oop, 也不是很难, 都是我们天天用的内置函数.
- 然后是关于地址的两问, 这里的考点主要是想看看开发者对 python 中赋值, 引用, 拷贝的了解.
- 最后一问. 很多从其他语言转来的开发者, 都会发现 python 中没有 const 关键词, 而且开发中不可能不用到常量, 很容易发现一个事实: python 无法定义一个常量.
最近的项目需要 python 开发, 收到简历, 然后面试了好几个 python 开发岗位, 为此我还准备了一些 python 的面试题. 面试了八九个吧, 甚至不乏 6 年开发经验的老鸟. 但在 python 基础方面, 真的很少能让我满意的. 现将面试题整理如下:
- with 语句作用, 这个能回答出上下文管理, 我就算他 OK 了, 大概有 50% 的面试者能答出来.
- __enter__ 和 __exit__ 的作用, 这个和上面的问题我抽一个问, 答案是一样的, 大概有 50% 能答对.
- __init__ 和 __new__ 的作用, 这个能回答出初始化和构造函数就行了, 这个基本都能回答出来.
- 定义函数有几种方法, 有 60% 能答出 lambda 表达式, 答出 lambda 表达式我都算 OK 了, 其实我期望有人答出类的 __call__ 成员方法, 但是一个都没有.
- 如何定义私有的成员变量, 这个问题出乎我的意料, 没有一个人能答出来, 甚至有一位跟我说用 private 关键字.
- 如何从外部访问私有成员变量. 其实这和上一题构成一个连环问题, 可惜这个问题没有上场的机会.
- dict 查询的时间复杂度, 这个问题非常出乎意料, 只有 20% 能回答出来.
- dict 查询最坏的时间复杂度, 这个问题能答出来的只有一位, 可惜这一位只答对了这道题.
- 怎么判断 for 循环由 break 退出还是正常退出. 这个只有一位答出 for else 语句, 以至于, 我到后来, 答出设置个 flag 我都算他对, 可惜答出的人也寥寥无几.
- 闭包是什么, 这个只要问了就能答对.
- 如何判断一个函数是不是闭包, 这个 80% 能答对.
- 如何用代码判断一个函数是不是闭包, 这个无人能答对.
- python 闭包可以应用在什么地方, 这个问题, 我没机会问.
- 用 type 和 isinstance 判断变量类型有什么区别. 这个竟然没人能答出来, 基本都说没区别.
- 如何获得一个变量的地址, 这个大部分都知道.
- 如何根据一个地址, 获得变量名, 这个是一个开放问题. 原则上是确定不了的, 因为有可能两个变量指向同一个地址. 我主要看面试者的分析过程, 这道题没有让我满意的答案.
- 如何定义一个常量, 即无法修改的变量. 答案是不可能. 我没有问可不可以, 而问的如何, 但是没有得到满意的答案. 后期, 我改为问可不可以定义一个无法修改的常量, 只有一个人答对.
最后谈谈感受. 我感觉我准备的面试题有个别可能比较偏, 其他的都是在开发中遇到的问题. 特别难的我都没有问, 比如协程, 元类等等. 最后面下来, 只有一个基本满意, 但是因为稳定性的原因, 还是没有招.
不禁感慨, 现在找一个靠谱的 python 开发真的太难了. python 是很火, 但是好的 python 开发者真的是稀缺动物. 可能每种语言都有类似的问题, 但是 python 尤甚. 究其原因我总结了几点:
- python 由于近两年的火爆, 而且非常容易上手, 引入了很多萌新开发者;
- 好多开发者把 python 当做脚本语言来开发, 这并没有错, 但是不是我期望的态度;
- python 轮子多, 众多开发者沦为调包侠, 缺乏对细节的把握.
短期内大势是不可能变的, 也不是我们能够解决的, 但是我们组招人的难题还是可以解决的, 那就是: 还得加钱.