Python程序员面试必知:10个高频核心问题解析
本文整理了Python面试中最高频的10个技术问题,涵盖类继承、__call__与__getattr__等魔术方法、__new__与__init__的区别、列表字典推导式、全局局部变量、变量交换、包导入控制、闭包实现及字符串性能优化。通过具体代码示例深入解析每个考点,帮助开发者掌握Python核心机制,提升面试通过率。
在整理Python程序员面试试题的过程中,我们发现了一些被面试官反复提及的高频问题,以下是本次收集的核心内容。
Python作为一门极受欢迎的编程语言,随着机器学习、云计算等技术的快速发展,市场对Python开发者的需求持续增长。为此,我们汇总了10个Python面试中常考的问题,供广大开发者参考学习。
类继承
假设存在如下代码片段:
class A(object): def show(self): print 'base show' class B(A): def show(self): print 'derived show' obj = B() obj.show()
请问如何调用类A的show方法? 具体实现方式如下:
obj.__class__ = A obj.show()
__class__属性指向类对象,只需将其赋值为类型A,随后调用show方法即可,但使用后需注意将属性恢复原状。
方法对象
问题:为了使以下代码正常运行,需要补充哪些代码?
class A(object): def __init__(self,a,b): self.__a = a self.__b = b def myprint(self): print 'a=', self.__a, 'b=', self.__b a1=A(10,20) a1.myprint() a1(80)
答案:为了让对象实例能够被直接调用,需要实现__call__方法。
class A(object): def __init__(self, a, b): self.__a = a self.__b = b def myprint(self): print 'a=', self.__a, 'b=', self.__b def __call__(self, num): print 'call:', num + self.__a
new和init
以下代码的输出结果是什么?
class B(object): def fn(self): print 'B fn' def __init__(self): print "B INIT" class A(object): def fn(self): print 'A fn' def __new__(cls,a): print "NEW", a if a>10: return super(A, cls).__new__(cls) return B() def __init__(self,a): print "INIT", a a1 = A(5) a1.fn() a2=A(20) a2.fn()
答案:
NEW 5 B INIT B fn NEW 20 INIT 20 A fn
使用__new__方法可以决定返回哪个对象,即在创建对象之前进行控制,这常用于单例模式或工厂模式的设计。而__init__则是在对象创建后调用的初始化方法。
Python list和dict生成
以下代码的输出结果是什么?
ls = [1,2,3,4]
list1 = [i for i in ls if i>2]
print list1
list2 = [i*2 for i in ls if i>2]
print list2
dic1 = {x: x**2 for x in (2, 4, 6)}
print dic1
dic2 = {x: 'item' + str(x**2) for x in (2, 4, 6)}
print dic2
set1 = {x for x in 'hello world' if x not in 'low level'}
print set1
答案:
[3, 4]
[6, 8]
{2: 4, 4: 16, 6: 36}
{2: 'item4', 4: 'item16', 6: 'item36'}
set(['h', 'r', 'd'])
全局和局部变量
以下代码的输出结果是什么?
num = 9 def f1(): num = 20 def f2(): print num f2() f1() f2()
答案:
9 9
num并非全局变量,因此每个函数都拥有自己独立的num副本。若需修改num,必须使用global关键字进行声明,示例如下:
num = 9 def f1(): global num num = 20 def f2(): print num f2() f1() f2() # prints: # 9 # 20
交换两个变量的值 使用一行代码交换两个变量值
a=8 b=9
答案:
(a,b) = (b,a)
默认方法
参考以下代码:
class A(object): def __init__(self,a,b): self.a1 = a self.b1 = b print 'init' def mydefault(self): print 'default' a1 = A(10,20) a1.fn1() a1.fn2() a1.fn3()
方法fn1/fn2/fn3均未定义,请添加代码使得所有未定义的方法都调用mydefault函数,上述代码的预期输出为:
default default default
答案:
class A(object): def __init__(self,a,b): self.a1 = a self.b1 = b print 'init' def mydefault(self): print 'default' def __getattr__(self,name): return self.mydefault a1 = A(10,20) a1.fn1() a1.fn2() a1.fn3()
__getattr__方法仅在调用未定义的方法时被触发。当fn1方法传入参数时,我们可以为mydefault方法增加*args不定参数以兼容这种情况。
class A(object):
def __init__(self,a,b):
self.a1 = a
self.b1 = b
print 'init'
def mydefault(self,*args):
print 'default:' + str(args[0])
def __getattr__(self,name):
print "other fn:",name
return self.mydefault
a1 = A(10,20)
a1.fn1(33)
a1.fn2('hello')
a1.fn3(10)
包管理
一个包中包含三个模块:mod1.py、mod2.py、mod3.py。在使用from demopack import *导入模块时,如何确保仅导入mod1和mod3?
答案:在__init__.py文件中增加以下配置:
__all__ = ['mod1','mod3']
闭包 编写一个函数,接收整数参数n,返回一个函数,该函数的功能是将传入的参数与n相乘并返回结果。
答案:
def mulby(num): def gn(val): return num * val return gn zw = mulby(7) print(zw(9));
性能
分析以下代码为何运行缓慢?
def strtest1(num): str='first' for i in range(num): str+="X" return str
答案:Python中的str是不可变对象,每次迭代都会生成新的str对象来存储新字符串。num值越大,创建的str对象越多,内存消耗也就越大。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









