在拉勾上投了十几个公司,大部分都被标记为不合适,有两个给了面试机会,其中一个本身以为确定不会去的,也就没有去面试,另外一个经历了一轮电话面加一轮现场笔试和面试,在此记录一下面试的内容,作个小的总结。python
上来没废话,直接开始问问题。面试
is
和==
的区别?is
判断两个引用是否指向的是同一个变量,即内存id
是否相等,==
则是调用的__eq__
方法,通常是用于判断值是否相等,也能够重写__eq__
方法实现想要的效果。数据库
dict
与list
的查找复杂度?dict
用hash
实现,查找的时间复杂度是O(1)
,list
则为O(n)
。编程
a/b/c
三个装饰器依次装饰函数fun()
,装饰器的执行顺序?注意装饰器函数自己通常有两层,在装饰的时候外层和内层顺序是相反的,详情能够参考这边文章python 多个装饰器的调用顺序。segmentfault
eval
和exec
。后端
Python
多线程可否充分利用CPU
多核心,为何?这里回答的是GIL
相关的东西,可深可浅,本身把握~数组
普遍意义上来讲,上下文是指程序运行的环境,Python
中常见于打开文件或网络链接,其实就是with
关键字,如:缓存
with open("test.txt") as file: print(file.read())
能够确保文件在最后会被关闭,只要对一个对象实现了__enter__
和__exit__
函数,就能够构造本身的上下文管理器了。服务器
感受直接解释概念很差解释,这里我回答的思路是举例子,异步说白了就是任务不须要同步进行,好比用爬虫爬取一个数据,而后再保存数据,接下来再去爬另外一个数据,这是同步;异步就是爬虫不用等着数据保存好,爬完一个直接去爬另外一个,数据保存的事情交给别的逻辑去慢慢处理;阻塞和非阻塞也是基于此的,同步的状况下会阻塞爬虫,爬虫须要等待数据的保存。(这部分是我本身的理解,建议看看专业的说明)网络
以前彻底没想过这个的问题,个人回答就是按一个差很少的精度去比较,好比到小数点第几位以前都是相等的,就认为两个数相等,或者Math
模块里可能有什么方法能够去精确对比,当时是这么回答的,如今查了一下基本也是这个思路,Math
模块中有一个isclose
函数用来判断两个浮点数的值是否接近或相等
MySQL
的索引通常是怎么实现的?B-Tree
(通常是B+Tree
)和Hash
,而后再简单介绍一下。
Flask
的实现有了解吗?只知道WSGI
,其他的不清楚,暂时还没去深刻看Flask
的源码。
跨了大半个北京城,还跟leader撒谎请假,也是心累。笔试题以下:
咩咩咩?不知道。(回来查了是25%
,具体能够自行搜索,反正脱离数学N
年是不管如何都想不出来的)。
RAND7()
随机返回1~7
,使用它构造一个RAND10()
函数随机返回10
。一开始写了个函数以下:
def rand10(): a = rand7() b = rand7() - 4 if b < 0: b = 0 return a + b
也是脑壳抽了,想得太简单,这个rand10
虽然能返回1~10
的随机数,但每一个数出现的几率不是1/10
,后面时间快到了检查的时候才反应过来。正确的思路是:
def rand10(): while 1: res = (rand7()-1)*7+rand7() # res等几率随机1~49 if res < 40: # 只取出0~39共40个数,每一个数出现的几率也是相等的 return res % 10 + 1 # 随机输出1~10
JAVA
代码改为Python
,并增长单元测试。JAVA
代码自己很简单,即便没学过也能看懂,改后的Python
代码以下:
class MyClass: __current = 0 def next(self): MyClass.__current += 1 return MyClass.__current
可是对于单元测试则仅限于听过的地步,须要用到unittest
,好像也有别的模块。
没啥好说的,一行代码必然是列表生成式,假设数组是nums
,代码以下:
sorted([n for n in nums if n % 2]) + sorted([n for n in nums if not n % 2], reverse=True)
单例就是说一个class
只能有一个instance
,实现的方法有不少,例如改写__new__
方法:
class Singleton(object): _instance = None def __new__(cls, *args, **kw): if not cls._instance: cls._instance = super(Singleton, cls).__new__(cls, *args, **kw) return cls._instance
SQL
获取点赞数最多的10
个问题;我平时也就用数据库查数据,在设计数据库上没有深刻研究,所以的我答案就简单写了有哪些表,字段分别是什么,至于题中的条件限制,就交由后台的程序逻辑去处理,而不是在数据库设计层面去限制。由于是本身设计的表结构,SQL
自己也就不难。
pop/push
及max
方法,要求能在O(1)
时间内取得最大值。LeetCode
原题啊!list
怎么能O(1)
取得最大值呢,无非是空间换时间,每push
一个数就同时记录当前的最大值。
呵呵。
我答的是数据库,由于好多没必要要或者可使用缓存的地方也频繁操做数据库,并且是使用的ORM
,但以前从哪看到ORM
不能确保对应的SQL
语句是最优的,所以能够尝试使用原生SQL
或者增长Redis
缓存。
(话说这不是运维的工做么。。。)呃,就是增长服务器啊,而后前面加一层负载均衡,把请求分配给不一样的服务器。(那不一样的服务器怎么使用你的Session
?)再加个Session
服务器。
LeetCode
才开始刷,就举了两道Codewars
上的题目,我也真是傻了,真的举了两道有意思(但本身没作好)的题。
其余就无非是一些为何想作后端开发之类的问题了,我的感受题目大部分也挺简单的,个人表现也算中规中矩吧,但面试官说我要进一步增强基础知识,具体哪方面(数据库、网络协议、仍是Python
自己)又语焉不详。