Python面试高频考点:斐波那契、闭包、反射与并发机制详解
本文深入解析Python面试中的经典算法与机制问题,涵盖斐波那契生成器实现、嵌套列表递归展开、可变默认参数陷阱、O(n)复杂度去重算法、闭包变量捕获错误及修正、以及__getattr__反射机制。同时简述Python 2与3差异、垃圾回收、多线程局限及epoll模型,帮助开发者全面掌握核心考点。
本文主要整理并解析了近期Python面试中出现的几道典型题目,旨在为求职者提供参考与学习思路。以下将逐一展开详细讲解:
一、生成斐波那契数列并提取前10项
def func(m): n,a,b = 0,1,1 while n < m: yield a a,b = b,a+b n += 1 for one in func(10): print one
这是一道基础且常见的算法题,核心在于理解表达式 a,b=b,a+b 的并行赋值逻辑,以及 yield 关键字在生成器中的作用。
二、递归展开包含子列表的列表
def myextend(alist): tmp = [] for one in alist: if isinstance(one,list): tmp.extend(myextend(one)) else: tmp.append(one) return tmp t = [1,2,5,[3,[],5,2,[57]],90] print t print myextend(t)
此题主要考察对递归调用思想的应用,处理嵌套结构时需正确设计终止条件与递归步骤。
三、分析给定代码的输出结果
def test(x,l=[]): for o in range(x): l.append(o) print l test(3) test(1,[3,2,1]) test(3)
预期输入输出如下:
[0,1,2] [3,2,1,0] [0,1,2,0,1,2]
当可变类型作为默认参数且未显式传递时,所有函数调用共享该参数对象;若显式传递了新参数(如示例中的第二种情况),则互不影响。
四、在保持元素首次出现顺序的前提下,对含重复数据的列表进行去重,要求时间复杂度为O(n)。
def fun(alist): result = [] temp = set() for o in alist: if o not in temp: result.append(o) temp.add(o) return result
此题重点考察对列表和集合操作复杂度的理解与组合使用。
五、已知如下函数定义,请写出其输出结果,并给出正确写法:
z = [lambda x:x*i for i in range(3)] x = [o(2) for o in z] print x
实际输出结果为 [4,4,4]
此处主要考察Python中闭包的特性及返回函数时的变量绑定问题。由于lambda函数捕获的是变量i的引用而非值,当调用时i已变为2,因此所有lambda计算结果均为4。
修正方案如下:
def func(): def m(x): def n(y): return x * y return n return [f(one) for one in range(3)] z = func() x = [o(2) for o in z] print x
修正后输出结果为 [0,2,4]
六、设计一个类,实现属性访问控制:若属性存在则返回其值,若不存在则返回属性名的字符串形式。
class Mycls(object): a = 0 def __getattr__(self,name): print name z = Mycls() print z.a,z.b
预期输出为 0 和 b。
此题主要考察Python的反射机制,特别是类中 __getattr__ 方法的使用。
需注意 __getattr__ 与 __getattribute__ 的区别:前者仅在属性查找失败时调用,可返回默认值或引发异常;后者在每次属性访问时都会被调用。
此外,建议参考 getattr() 和 hasattr() 等内置函数的用法。
简答题部分
- 简述Python 2与Python 3的主要区别
- 解释Python的垃圾回收机制
- 说明Python中多线程的实现方法、局限性,以及其他的并发处理方案
- 简述epoll、select、poll三种I/O多路复用模型的区别
总结
以上就是本文的全部内容,希望这些解析对大家的学习或工作有所帮助。如有疑问,欢迎留言交流,感谢支持。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













