记搜狗一次不成功的Python后端面试经历
面试搜狗Python后端结束快一个月了,终于有时间来做一个简单的总结了。
简介:工作不久,基础后端岗位,一面结束,失败。
先做了几个笔试题,面试开始会根据笔试题问一些内容。下面将整理一下还能想起来的内容。
1.一个代码题,要求输出的结果是什么,并解释原因
def f(x, l=[]):
for i in xrange(x):
l.append(i**2)
print l
f(2) # [0, 1]
f(3, [3, 2, 1]) # [3, 2, 1, 0, 1, 4]
f(3) # [0, 1, 0, 1, 4]
面试过程:输出结果如上所示,当时我回答的原因是列表是可变对象,设置为函数的默认参数的时候,会保留值,应该默认设置为None这种类型。面试官又问为什么可变对象就不行呢?我回答在Python中函数也是一个对象,他的一个属性会保存相应的默认值。
简要总结:根据官方文档,默认参数在定义的时候,只初始化一次。可以在函数对象的func_defaults属性中查看默认参数。如下所示,通过把函数对象的默认参数的内存地址打印出来,可以看到确实是同一个列表地址。
print id(f.func_defaults[0])
f(2)
print id(f.func_defaults[0])
f(3, [3, 2, 1])
print id(f.func_defaults[0])
f(3)
2.*args 和 **kwargs 是什么,为什么要使用它们?
面试过程: 回答了前者是位置参数,后者是关键字参数,在函数定义时,参数不确定的情况下可以使用,是一个pack过程,在函数调用时,是一个unpack过程。
3.说一下Python的内存管理,说一下垃圾回收机制?
面试过程: 内存管理包括垃圾回收、引用计数、内存池,垃圾回收机制是引用计数为主、标记清除和分代回收为辅。然后我就用大白话解释了一下我对这些内容的理解,导致说的比较尴尬。。
回顾总结: 关于内存管理,个人觉得这篇比较好,点击链接,说的比较明白。垃圾回收的三种机制是互相关联的,可以直接搜索找到合适自己的答案。
4.编程实现二分查找?
当时写的代码如下
def b_search(data, k):
if not data:
return -1
left, right = 0, len(data) - 1
while left <= right:
mid = (left + right) / 2
if data[mid] == k:
return mid
elif data[mid] > k:
right = mid - 1
else:
left = mid + 1
return -1
追问,如果给定的数组中中有多个重复值,如何进行查找?描述一下思路。当时理解成查找数组中这个值的始末索引了,回答的是使用二分法分别查找始末索引就可以了。面试官说直接使用二分法就可以。额?
5.经典问题,一次可以上1个台阶,也可以上2个...n个,问一共有多少种上法
当时写的代码大概如下,并用公式表示了一下。
def fib(n):
a, b = 1, 2
for i in range(n):
yield a
a, b = b, 2 * b
6.当从b模块中导入a,运行b,会输出什么?a,b内容如下所示
# a.py
print 'm'
def f():
print 'fm'
class A(object):
print 'A.m'
def fa(self):
print 'A.f.m'
# b.py
import a
运行b后,输入结果如下所示:
m
A.m
面试过程:我当时记得说了Python中的函数会延迟生成,在导入时不直接执行,而模块的顶级代码会直接执行。类变量没说,理解不够深入。
原因:Python模块导入时,会创建一个module对象,并插入到sys.modules中,可以通过以下代码查看模块的属性
print dir(sys.modules['a'])
模块中的顶层变量会在模块导入时就执行,类的类变量也是如此,因此在模块中应该尽量避免这种,放在函数中进行延迟生成。这里需要深入了解模块的导入机制
7.说一下对装饰器的理解,原理是什么?如何使用装饰器实现求函数的执行时间?
面试过程:装饰器可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用,为已经存在的对象添加额外的功能,比如性能测试等。原理当时一下忘记了是闭包了,最后写的求时间的装饰器也不符合要求.
回顾总结:装饰器原理是使用了闭包实现的,是一种面向切面编程的模式(对设计模式理解不多,下一步需要抽时间学习设计模式了!)。对装饰器实现的执行时间,代码如下所示:(Python中有自带的timeit模块用来求执行时间)。
import time
from functools import wraps
def timeit(func):
@wraps(func)
def wrapper():
start = time.clock()
func()
end = time.clock()
print 'used:', end - start
return wrapper
@timeit
def f():
time.sleep(3)
f()
8.对闭包的理解?
面试回答:我答的是在一个函数中返回的内部函数,在函数结束后,内部函数还可以继续使用。(完全大白话!又一次尴尬了)
回顾总结:闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。
9.对函数对象的理解?
回顾总结:忘了咋回答的了!函数可以赋值给变量、可以作为元素添加到集合对象中、可作为参数值传递给其它函数,还可以当做函数的返回值。对于函数对象的理解,可以看这里
10.如何理解Python中一切皆对象?
回顾总结:Python中所有的对象都有身份、类型和值。具体内容可以直接搜索,感觉这个博客写的也不错。当然要最好的理解还是看源码。
11.对协程的理解,协程和线程的区别?
回顾总结: 协程是使用装饰器实现的,GIL,程序员自己来控制。协程适合I/O密集型操作,异步功能。
12.二叉树求深度?
递归思路
def get_depth(tree):
if not tree:
return 0
if not tree.left and not tree.right:
return 1
return 1 + max(get_depth(tree.left), get_depth(tree.right))
13.MySQL索引优化?
回顾总结:这个在很多面试中会问到,工作中也会用到,需要认真学好MySQL。关键点:最左匹配,联合索引,在哪种情况下建立索引,B树原理,explain查看语句等。网上搜一下挺多内容的,不过还是最好看一下《高性能MySQL》这本书。
14.Redis缓存,数据类型等?
回顾总结:字符串、列表、hash、set、有序集合等。
总结
面试内容相对比较深,广度一般,关注了很多Python的深层原理。
反思
- 对于很多特性自己还是了解的不够深入;
- 在学习过程中,自己习惯于把一些概念转化成大白话来加深理解,导致对概念的专业术语反而记不住了,说起来显得不专业;
- 代码能力有待提高;
- 要想面试好,还是需要更好的准备的,工作之余直接去面试有点仓促。
记搜狗一次不成功的Python后端面试经历的更多相关文章
- 记2017年年底,几次Python后端面试
1. 果壳 电话面试: 说一下TCP的三次握手,四次挥手,为什么会这样? http安全的性的了解,说一下对cookie和session的了解: 对mysql的了解,说一下你常用的数据类型,char和v ...
- python后端面试第七部分:项目部分--长期维护
################## 项目部分 ####################### 1,你怎么测试自己的代码的?自测 2,开发使用windows还是Linux,虚拟环境的 ...
- 知乎Python后端面试总结
一面 写个快速排序热热身,分析一下复杂度,如果不使用额外的空间,应该怎么写? 说一下Flask中g是怎么实现的,原理是什么? 说一下浏览器从输入url到页面渲染的过程,越详细越好: 了解web安全吗? ...
- python后端面试第八部分:制作简历和如何面试--长期维护
############### 就业指导 ################ 这里面有套路,你懂了这个套路,你会找到更好的工作,你会更快的找到工作, ,如何制作简历,五颗星 ,如何投递简历 ...
- python后端面试第五部分:Linux操作系统--长期维护
################## Linux操作系统 ####################### 1,讲一下你常用的Linux/git命令和作用: 2,查看当前进程是用什么命 ...
- python后端面试第三部分:数据储存与缓存相关--长期维护
1. 列举常见的关系型数据库和非关系型都有哪些?2. MySQL常见数据库引擎及比较?3. 简述数据三大范式?4. 什么是事务?MySQL如何支持事务?5. 简述数据库设计中一对多和多对多的应用场景? ...
- python后端面试第二部分:网络编程和并发编程--长期维护
1. 简述 OSI 七层协议. 2. 什么是C/S和B/S架构? 3. 简述 三次握手.四次挥手的流程. 4. 什么是arp协议? 5. TCP和UDP的区别? 6. 什么是局域网和广域网? 7. 为 ...
- python后端面试第一部分:python基础--长期维护
1. 为什么学习Python? 2. 通过什么途径学习的Python? 3. Python和Java.PHP.C.C#.C++等其他语言的对比? 4. 简述解释型和编译型编程语言? https:/ ...
- 如何应对外包公司(文思海辉)的Python后端面试
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_151 最近春招如火如荼,我接触到的几位同学也纷纷去市场里试了试水,不得不说由于疫情的影响,导致目前中等水平的开发者择业有了些许困难 ...
随机推荐
- Selenium中使用Cookies绕过登录
在使用selenium测试后台时常常每个流程都需要走登录流程,这样自然比较浪费时间.如果遇到登录需要输入验证码等情况,就可能出师未捷身先死. 在Web应用中,登录状态通常是通过Cookie中对应的se ...
- 使用Excel拼凑SQL语句
快速将一列多行数据合并到一个单元格 EXCEL如何快速将一列多行数据合并到一个单元格,并加分隔符?这是批量处理由一线业务员统计的数据时的常用方法,尤其是当一列数据是wher ...
- yquery-操作样式属性
前几天回家,参加了全国的成人高考,都说学历是找工作的敲门砖,其实一点都不假,尤其是现在的社会竞争力那么强,你不学就会被淘汰.像要过自己想要的生活,就必须努力学习,努力赚钱,买自己想买的,过自己想过的. ...
- 大整数乘法(c++)【转载】
摘自<c++数据结构原理与经典问题求解> #include #include #include using namespace std; //返回位数为size1+size2 int* m ...
- python定时任务实现
安装 pip install schedule 示例代码 import schedule import time def job(): print("I'm working..." ...
- ccf 201803-2 碰撞的小球(Python)
问题描述 数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐标L处.有n个不计体积的小球在线段上,开始时所有的小球都处在偶数坐标上,速度方向向右,速度大小为1单位长度每秒. 当小球到达线 ...
- SQL-W3School-高级:SQL NULL 函数
ylbtech-SQL-W3School-高级:SQL NULL 函数 1.返回顶部 1. SQL ISNULL().NVL().IFNULL() 和 COALESCE() 函数 请看下面的 &quo ...
- RotateDrawable
用来对Drawable进行旋转,也是通过setLevel来控制旋转的,最大值也是:10000 相关属性如下: fromDegrees:起始的角度,,对应最低的level值,默认为0 toDegrees ...
- 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_13-webpack研究-webpack入门程序
创建webpack测试的目录 定义webpack的入口文件 mdel01必须导出,main里面才能导入 导出多个 数组的写法 main是入口文件,里面已经引入了vue.min和model01.js ...
- EasyUI之toolTip
<a class="easyui-tooltip" title="提示框" href="http://www.baidu.com"&g ...