10个Python面试常问的问题(小结)
概述
Python是个非常受欢迎的编程语言,随着近些年机器学习、云计算等技术的发展,Python的职位需求越来越高。下面我收集了10个Python面试官经常问的问题,供大家参考学习。
类继承
有如下的一段代码:
classA(object): defshow(self): print'baseshow' classB(A): defshow(self): print'derivedshow' obj=B() obj.show()
如何调用类A的show方法了。
方法如下:
obj.__class__=A obj.show()
__class__方法指向了类对象,只用给他赋值类型A,然后调用方法show,但是用完了记得修改回来。
方法对象
问题:为了让下面这段代码运行,需要增加哪些代码?
classA(object): def__init__(self,a,b): self.__a=a self.__b=b defmyprint(self): print'a=',self.__a,'b=',self.__b a1=A(10,20) a1.myprint() a1(80)
答案:为了能让对象实例能被直接调用,需要实现call方法
classA(object): def__init__(self,a,b): self.__a=a self.__b=b defmyprint(self): print'a=',self.__a,'b=',self.__b def__call__(self,num): print'call:',num+self.__a
new和init
下面这段代码输入什么?
classB(object): deffn(self): print'Bfn' def__init__(self): print"BINIT" classA(object): deffn(self): print'Afn' def__new__(cls,a): print"NEW",a ifa>10: returnsuper(A,cls).__new__(cls) returnB() def__init__(self,a): print"INIT",a a1=A(5) a1.fn() a2=A(20) a2.fn()
答案:
NEW5
BINIT
Bfn
NEW20
INIT20
Afn
使用new方法,可以决定返回那个对象,也就是创建对象之前,这个可以用于设计模式的单例、工厂模式。init是创建对象是调用的。
Pythonlist和dict生成
下面这段代码输出什么?
ls=[1,2,3,4] list1=[iforiinlsifi>2] printlist1 list2=[i*2foriinlsifi>2] printlist2 dic1={x:x**2forxin(2,4,6)} printdic1 dic2={x:'item'+str(x**2)forxin(2,4,6)} printdic2 set1={xforxin'helloworld'ifxnotin'lowlevel'} printset1
答案:
[3,4]
[6,8]
{2:4,4:16,6:36}
{2:'item4',4:'item16',6:'item36'}
set(['h','r','d'])
全局和局部变量
下面这段代码输出什么?
num=9 deff1(): num=20 deff2(): printnum f2() f1() f2()
答案:
9
9
num不是个全局变量,所以每个函数都得到了自己的num拷贝,如果你想修改num,则必须用global关键字声明。比如下面这样
num=9 deff1(): globalnum num=20 deff2(): printnum f2() f1() f2() #prints: #9 #20
交换两个变量的值
一行代码交换两个变量值
a=8 b=9
答案:
(a,b)=(b,a)
默认方法
如下的代码
classA(object): def__init__(self,a,b): self.a1=a self.b1=b print'init' defmydefault(self): print'default' a1=A(10,20) a1.fn1() a1.fn2() a1.fn3()
方法fn1/fn2/fn3都没有定义,添加代码,是没有定义的方法都调用mydefault函数,上面的代码应该输出
default
default
default
答案:
classA(object): def__init__(self,a,b): self.a1=a self.b1=b print'init' defmydefault(self): print'default' def__getattr__(self,name): returnself.mydefault a1=A(10,20) a1.fn1() a1.fn2() a1.fn3()
方法getattr只有当没有定义的方法调用时,才是调用他。当fn1方法传入参数时,我们可以给mydefault方法增加一个*args不定参数来兼容。
classA(object): def__init__(self,a,b): self.a1=a self.b1=b print'init' defmydefault(self,*args): print'default:'+str(args[0]) def__getattr__(self,name): print"otherfn:",name returnself.mydefault a1=A(10,20) a1.fn1(33) a1.fn2('hello') a1.fn3(10)
包管理
一个包里有三个模块,mod1.py,mod2.py,mod3.py,但使用fromdemopackimport*导入模块时,如何保证只有mod1、mod3被导入了。
答案:增加init.py文件,并在文件中增加:
__all__=['mod1','mod3']
闭包
写一个函数,接收整数参数n,返回一个函数,函数的功能是把函数的参数和n相乘并把结果返回。
答案:
defmulby(num): defgn(val): returnnum*val returngn zw=mulby(7) print(zw(9));
性能
解析下面的代码慢在哪
defstrtest1(num): str='first' foriinrange(num): str+="X" returnstr
答案:python的str是个不可变对象,每次迭代,都会生成新的str对象来存储新的字符串,num越大,创建的str对象越多,内存消耗越大。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。