面试搜狗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的深层原理。

反思

  1. 对于很多特性自己还是了解的不够深入;
  2. 在学习过程中,自己习惯于把一些概念转化成大白话来加深理解,导致对概念的专业术语反而记不住了,说起来显得不专业;
  3. 代码能力有待提高;
  4. 要想面试好,还是需要更好的准备的,工作之余直接去面试有点仓促。

记搜狗一次不成功的Python后端面试经历的更多相关文章

  1. 记2017年年底,几次Python后端面试

    1. 果壳 电话面试: 说一下TCP的三次握手,四次挥手,为什么会这样? http安全的性的了解,说一下对cookie和session的了解: 对mysql的了解,说一下你常用的数据类型,char和v ...

  2. python后端面试第七部分:项目部分--长期维护

    ##################    项目部分       ####################### 1,你怎么测试自己的代码的?自测 2,开发使用windows还是Linux,虚拟环境的 ...

  3. 知乎Python后端面试总结

    一面 写个快速排序热热身,分析一下复杂度,如果不使用额外的空间,应该怎么写? 说一下Flask中g是怎么实现的,原理是什么? 说一下浏览器从输入url到页面渲染的过程,越详细越好: 了解web安全吗? ...

  4. python后端面试第八部分:制作简历和如何面试--长期维护

    ###############     就业指导    ################ 这里面有套路,你懂了这个套路,你会找到更好的工作,你会更快的找到工作, ,如何制作简历,五颗星 ,如何投递简历 ...

  5. python后端面试第五部分:Linux操作系统--长期维护

    ##################     Linux操作系统      ####################### 1,讲一下你常用的Linux/git命令和作用: 2,查看当前进程是用什么命 ...

  6. python后端面试第三部分:数据储存与缓存相关--长期维护

    1. 列举常见的关系型数据库和非关系型都有哪些?2. MySQL常见数据库引擎及比较?3. 简述数据三大范式?4. 什么是事务?MySQL如何支持事务?5. 简述数据库设计中一对多和多对多的应用场景? ...

  7. python后端面试第二部分:网络编程和并发编程--长期维护

    1. 简述 OSI 七层协议. 2. 什么是C/S和B/S架构? 3. 简述 三次握手.四次挥手的流程. 4. 什么是arp协议? 5. TCP和UDP的区别? 6. 什么是局域网和广域网? 7. 为 ...

  8. python后端面试第一部分:python基础--长期维护

    1. 为什么学习Python? 2. 通过什么途径学习的Python? 3. Python和Java.PHP.C.C#.C++等其他语言的对比? 4. 简述解释型和编译型编程语言?   https:/ ...

  9. 如何应对外包公司(文思海辉)的Python后端面试

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_151 最近春招如火如荼,我接触到的几位同学也纷纷去市场里试了试水,不得不说由于疫情的影响,导致目前中等水平的开发者择业有了些许困难 ...

随机推荐

  1. P4717 快速沃尔什变换FWT 模板题

    #include <bits/stdc++.h> using namespace std; #define rep(i,a,n) for (int i=a;i<n;i++) #def ...

  2. jira默认是jira_user用户组的用户有登录jira的权限

    场景描述: 今天给jira新建了几个用户组,看着英文的jira_user和jira_developer有点多余,所以就给删掉了.然后后面新建了开发人员和测试人员用户组,进行了人员分配和项目分配,可是突 ...

  3. 使用setUncaughtExceptionHandler在线程外面捕获异常

    package com.dwz.concurrency.chapter11; /** * Thread的run方法是不能throw出异常的,只能在日志或者console中打印出来 */ public ...

  4. 微信小程序之简单记账本开发记录(一)

    下载并安装微信开发者工具 在选择开发记账本程序的时候犹豫着选择android studio还是微信小程序 最后选择了微信小程序,因其便利和快捷. 话不多说,第一步,下载并安装微信开发者工具.下面是教程 ...

  5. JavaWeb_(Spring框架)用户登陆Spring整合到Servlet中

    一.使用servlet技术开发用户登陆功能 在MySQL中准备一个user表,表中增加一条假数据 使用Servlet实现用户登陆的功能 用户登陆的<from>表单 <form id= ...

  6. Nginx 之 Location 的整理

    1. Location 的整理 在将配置解析完后,所有的 location 此时都以 tree 的形式组织起来,具体可参考 Nginx之 Location 的生成. 此时需要对所有 server 下的 ...

  7. MISS YOU

      文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论

  8. x86 linux下如何交叉编译?

    答: 需要首先指定两个环境变量CROSS_COMPILE和ARCH 如交叉编译arm64的程序: export CROSS_COMPILE="aarch64-linux-gnu-" ...

  9. [Java复习] JVM

    Part1:Java类加载机制:类加载器,类加载机制,双亲委派模型 1. Java 类加载过程? 类加载过程即是指JVM虚拟机把.class文件中类信息加载进内存,并进行解析生成对应的class对象的 ...

  10. set serveroutput on 命令

    使用set serveroutput on 命令设置环境变量serveroutput为打开状态,从而使得pl/sql程序能够在SQL*plus中输出结果 使用函数dbms_output.put_lin ...