记搜狗一次不成功的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 最近春招如火如荼,我接触到的几位同学也纷纷去市场里试了试水,不得不说由于疫情的影响,导致目前中等水平的开发者择业有了些许困难 ...
随机推荐
- centos 利用iptables来配置linux禁止所有端口登陆和开放指定端口的方法
1.关闭所有的 INPUT FORWARD OUTPUT 只对某些端口开放. 下面是命令实现: iptables -P INPUT DROPiptables -P FORWARD DROPiptabl ...
- busTrace VS HW protocol analyzer - 好东西推荐
最近在找PCIe/NVMe协议分析仪,发现一款软件分析仪:busTRACE,非常不错的工具,对于从事协议开发的同胞们,是个福利,下面把硬件和软件两种分析仪的各自的优势比较了一下(来自busTrace文 ...
- Feeding Chicken
D - Feeding Chicken 从左上角开始,往右下角开始遍历,但是遍历的时候需要注意一点,就是遍历的时候需要连起来,就比如第一行从左往右进行遍历,但是第二行不能从左往右了,因为这样就分开了, ...
- 将String类型的字符串拼接成以逗号分隔的字符输出
package test; import java.util.ArrayList; import java.util.List; public class Tesdssss { private sta ...
- 手写alert弹框(一)
采用原生的JavaScript, html代码 <meta name="viewport" content="width=device-width, initial ...
- 夺命连环问:一个 TCP 连接可以发多少个 HTTP 请求?
曾经有这么一道面试题:从 URL 在浏览器被被输入到页面展现的过程中发生了什么? 相信大多数准备过的同学都能回答出来,但是如果继续问:收到的 HTML 如果包含几十个图片标签,这些图片是以什么方式.什 ...
- idea 2018注册码(激活码)
最近做一个项目,用idea 社区版的 但是缺少了好多功能 无奈只能用专业版的,但是需要注册激活 下面是我的注册方法 1.打开了idea 会提示让激活 选择Licensse server 2. ...
- Javascript中数组查重的方法总结大全
数组查重:简单点说,就是找出数组中重复的元素然后去除,最后得到一个没有重复元素的数组. // 方法一思路: 1.构建一个新的数组,用于存放结果. 2.for循环中每次从数组取出一个 ...
- python之selectors模块
python之selectors模块 selectors模块是在python3.4版本中引进的,它封装了IO多路复用中的select和epoll,能够更快,更方便的实现多并发效果. 官方文档见:htt ...
- 在Mac 搭建robotframework 环境
折腾来一下午,遇到了好多坑 坑 1.不要用pip 下载wxpython 2.不要用mac自带的python 3.不要自己下载wxpython 步骤: 1. 安装homebrew, /usr/bin/r ...