python十道经典面试题


第一题,对象的类属性指向类对象

class A():    def show(self):        print('A_show')class B():    def show(self):        print('B_show')obj =B()obj.show()#这样我们能够正常调用#那么我们能不能#obj.show()#我们想调用A中的show

我们看一下

obj.__class__ =A   obj.show()

这样就可以直接调用了

第二题、方法对象__call__

class People():    def __init__(self,length):        self.__length = length    def hand(self):        print('手有 {} 米'.format(self.__length))a=People(1)a.hand()  #这样我们是能够完美运行的

那么我们不小心 a(10) 这样了,我希望他能够正常运行

这里我们需要用到一个对象方法__call__

扫描二维码关注公众号,回复: 9030446 查看本文章
class People():    def __init__(self,length):        self.__length = length              def hand(self):        print('手有 {} 米'.format(self.__length))            def __call__(self, *args):        return self.hand()a=People(1)a()  #这时a() 会找到__call__ 然后运行返回的函数

第三题,__new__ 和 __init__

1.init 通常用于初始化一个新实例,控制这个初始化的过程,比如添加一些属性, 做一些额外的操作,发生在类实例被创建完以后。它是实例级别的方法。

 2 ,new 通常用于控制生成一个新实例的过程。它是类级别的方法。

__new__ 在__init__ 之前运行

3、 new至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供

4 、new必须要有返回值,返回实例化出来的实例,这点在自己实现new时要特别注意,可以return父类new出来的实例,或者直接是object的new出来的实例

class A():    def func(self):        print('A_func')        def __init__(self):        print('A_init')class B():    def func(self):        print('B_func')            def __new__(cls, a):        print('new  ',a)        if a>10:            return super(B,cls).__new__(cls)        return A()        def __init__(self,a):        print('B_init')#想想输出结果        a = A()b = B(5)b.func()b = B(11)b.func()

第四题 ,列表解析式

生成列表

list1 = [1,2,3,4]#取出list1中大于二的值list2 =[i for i in list1 if i>2]   print(list2)

生成字典

dict1 = {i: i*2 for i in  list1 if i*2 >4 }print(dict1)
dict2 = {i: 'items'+str(i*2) for i in  list1 if i*2 >4 }print(dict2)

第五题,变量域

num = 666def f1():    num = 888    print(num)def f2():    print(num)         print(num) f1() print(num) f2() # 666#888#666#666

需要在函数中改变变量

我们需要使用global

这只是局部变量和全局变量的变量域

我们继续看一下函数嵌套的变量域

def fun():    num = 0        def fun1():        num = 1                def fun2():            print(num)        fun2()    fun1()fun()#1

在函数嵌套中变量会逐级网上找变量

这样不会存在找不到变量的问题

在fun2()找不到会到fun1()中找

第六题,默认方法,python反射机制,getattr

class A:    def __init__(self,a,b):        self.a = a        self.b = b        def func(self):        print('a+b={}'.format(self.a+self.b))    a1 = A(1,2)a1.func()#al.fun() 这样呢,就该报错了

好吧,我不想让它报错

class A:    def __init__(self,a,b):        self.a = a        self.b = b        def func(self):                print('a+b={}'.format(self.a+self.b))        def __getattr__(self,args):        return self.func  #切记这里不能加() 因为 func()()是不能执行的    a1 = A(1,2)a1.fun()#3

 

__getattr__,hasattr

这是python的反射机制,getattr会接收参数,

然后执行,对应的还有hasattr,大家可以自己深究

第七题,包管理

当 一个包pack里有三个模块,model, model2, model3, 

采用from pack import *

怎样只导入 model model2

添加 __init__.py文件,在文件中加入__all__ = ['model', 'model2'] 

就能实现了

第八题, 函数闭包

#要求,写一个函数,接受一个整数参数N,返回一个函数,函数功能是把,函数的参数和N相乘的结果返回

def f1(N):    def f2(val):        return N*val    return f2

第九题,深浅拷贝

这题解释量比较大,大家可以到我的另外一篇文章学习

点击链接就可以跳转

第十题,装饰器

装饰器本质就是函数 功能是为其它的函数添加功能

原则是

1,不改变修饰函数的源代码 

2, 不修改修饰函数的调用方式

装饰器=高阶函数+函数嵌套+闭包

我想在不改变一个函数源码状态下,测试运行时间

import timedef timer(func):    def wapper(a,*args, **kwargs):        if a ==1:            start = time.time()            res = func(*args, **kwargs)            end = time.time()            print('函数运行时间',end-start)            return res        else:            return 1    return wapper    #我们测试下面这个函数的时间#只需要把上面的函数加一个@写在函数上#就可以实现了a=1@timerdef cal(a,l):    res = 0    for i in l:        time.sleep(0.01)        res+=i    return resres = cal(range(20))print(res)    

运行一下,你就知道装饰器的强大之处了

知道这些面试题,并不代表你面试就能够顺利通过

我们还是需要在平时多记录知识

祝大家早日找到适合自己的工作

今天的十道题就到这里了

如果对你有用那么,记得点再看

如果你是土豪,

赞赏一波,相当感谢大家的支持

发布了37 篇原创文章 · 获赞 16 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_42236288/article/details/101778778