1、请说一说lambda函数的作用:请用lambda和reduce实现1到100的累加
答:一些简单的需要用函数去解决的问题就可以用匿名函数,匿名函数的函数体只有一行 reduce(lambda x,y:sum([x,y]),range(1,101)) #吧1传给了x,吧101传给了y,计算除了1-100的和 回顾一下map函数: print(list(map(lambda x,y:sum([x,y]),range(1,101),range(1,101)))) #第一个参数是一个函数,第二个参数是一个序列
2、请描述一下tuple,list,dict,set的特点
tuple: 可以存多个值;不可变数据类型,不可修改,更多是用来查询 list : 可以存多个值;列表是有序的,可以通过索引取值;列表可变数据类型,可以修改 dict : 可以存多个值;字典是无序的,值可以是任意数据类型,key必须是不可变数据类型的 可变数据类型,可以修改; set : 可以存多个值;集合和字典一样,也是无序的;可变数据类型,但是里面的元素是不可变数据类型 set就像是把Dict中的key抽出来了一样,类似于一个List,但是内容又不能重复,通过调用set()方法创建 去重的作用 set的元素遵循的三个规则: - 每个元素是不可变数据类型 - 没有重复的值 - 无序
3、请说一下staticmethod和classmethod的区别
staticmethod和classmethod的相同点: - 1.都可以用类名去调用里面的方法和属性 - 2.不需要实例化 staticmethod和classmethod的不同点: - 静态方法不要要传self了, - 类方法必须有一个cls参数表示这个类,可以使用类属性 举例: class Foo(object): AGE = 18 def __init__(self,name): self.name = name @classmethod def eat(cls): return "我是eat" @staticmethod def drank(): return "我是drank" def play(self): return "玩玩玩" def sing(cls): #没有加类方法或者静态方法的时候是不能用类名去直接调用的,要是掉用也需要随便传个参数,这样也没啥意思, #所以我们可以用装饰器,这样就可以直接用类名去调用了,其实也可以通过实例化对象来调用的,但是用类方法和 # 静态方法连实例化都不用了,直接就可以用类名去调用了 ,还会比较推荐用的 return "唱唱唱" 单例模式的时候就用到了类方法
4、请说一说迭代器和生成器的理解
- 可迭代对象(iterable):含有__iter__方法,返回一个迭代器 - 迭代器(Iterator):含有__next__方法 - 生成器:含有yield的就是一个生成器,也有__next__,具有迭代特性。 生成器的好处,就是一下子不会在内存中生成太多的数据 生成器的本质就是一个迭代器。 - 装饰器:本质是一个闭包函数,
5、请用Python实现单例模式,至少两种方式
单利模式有四种实现方式,分别是: - 文件导入 - 类实现的 - 基于__new__方法实现的 - 基于metaclass实现的 方式一: import threading class Singleton(object): _instance_lock = threading.Lock() @classmethod def inistance(cls,*args,**kwargs): if not hasattr(Singleton,"_instance"): #判断这个对象有没有_instance这个属性,如果没有就常见一个 with Singleton._instance_lock: if not hasattr(Singleton, "_instance"): Singleton._instance = Singleton(*args,**kwargs) return Singleton._instance def task(): print(Singleton.inistance()) for i in range(5): th = threading.Thread(target=task,) th.start() 方式二: import threading,time class Singleton(object): _instance_lock = threading.Lock() def __init__(self): time.sleep(2) def __new__(cls, *args, **kwargs): if not hasattr(Singleton,"_instance"): with Singleton._instance_lock: if not hasattr(Singleton, "_instance"): Singleton._instance = object.__new__(cls,*args,**kwargs) return Singleton._instance # obj1 = Singleton() # print(obj1) # # obj2 = Singleton() # print(obj2) def task(): obj = Singleton() print(obj) for i in range(10): th = threading.Thread(target=task) #说个线程共享一个内存空间,所以会有竞争问题,加吧锁,牺牲效率,保证数据的安全 th.start()
7、请实现一个装饰器,限制该函数被调用的频率,如10秒1次
import time def wrapper(func): def inner(*args,**kwargs): time.sleep(10) ret = func(*args,**kwargs) return ret return inner @wrapper def index(): print("执行我啦") for i in range(1,4): print("第%s次"%i) index()
8、django的生命周期
- wsgi,中间件,路由,视图(进行ORM操作拿到数据在模板中渲染) - 你用中间件做过什么? - 用户登录 - 权限管理 - 日志管理,可以做,但是没必要,以后网站运行起来的时候有个nginx - 路由需要注意的:一个url对应一个的函数,还可以加正则表达式,在url上一定要加起始终止符 - 视图 接受请求 - request.path_info :获取当前的url - request.POST - request.body - request.FILES - request.GET .... 返回内容 render HttpResponse redirect
9、orm数据库操作
- 13个API all,fliter,first,last,get,values,values_list,order_by,distinct,exclude,reverse,count,exits - 2个: join:datalist = models.Userinfo.objects.all().only("name","email") #拿到的还是一个QuerySet集合,仅仅取name和email defer:models.Userinfo.objects.all().defer("name","email") #阻止,不取name和email - FK
10、什么是可变数据类型,什么是不可变数据类型?
可变数据类型:id不变,value值可以改变
不可变数据类型:value改变,id(内存地址)也跟着改变
浙公网安备 33010602011771号