面试题(持续更新)
一、
# class A: # name = [] # # p1 = A() # p2 = A() # p1.name.append(1) # print(p1.name,p2.name,A.name) # # [1],[1],[1]
# 分别是什么?
# p1.age = 12
# print(p1.age,p2.age,A.age)
# 分别又是什么?为什么?
#
# p2.age,A.age 都报错
二、
# class A: # def __init__(self): # self.func1() # # def func1(self): # print('in A func1') # # class B(A): # def func1(self): # print('in B func1') # # obj = B() # obj.func1() # 两个 in B func1
三、
# class A: # a = 0 # b = 1 # def __init__(self): # c = 222 # 注意这里c = 222 与 self.c = 222的区别 # d = A() # d.a = 1 # 给d增加属性a # d.b = 2 # 给d增加属性b # d.c = {'1':1} # # 给d增加属性c # e = A() # print(e.a,e.b) #0 1 222 # print(e.c) 结果: # 0 1 没有
class UserInfo(object): pass class Department(object): pass class StarkConfig(object):44444 def __init__(self,num): self.num = num def changeList(self,request): print(self.num, request) def run(self): self.changeList(999) class RoleConfig(StarkConfig): def changeList(self,request): print(666,self.num) class AdminSite(object): def __init__(self): self._registry = {} def register(self,k,v): self._registry[k] = v(k) site = AdminSite() site.register(UserInfo, StarkConfig) site.register(Department, RoleConfig) for k , row in site._registry.items(): row.run() 结果: #<class '__main__.UserInfo'> 999 #666 <class '__main__.Department'>
lambda:
v = [lambda:x for x in range(10)] print(v) #[<function <listcomp>.<lambda> at 0x000001AA4C125598>, <function <listcomp>.<lambda> at 0x000001AA4C125620>, <function <listcomp>.<lambda> at 0x000001AA4C1256A8>, <function <listcomp>.<lambda> at 0x000001AA4C125730>, <function <listcomp>.<lambda> at 0x000001AA4C1257B8>, <function <listcomp>.<lambda> at 0x000001AA4C125840>, <function <listcomp>.<lambda> at 0x000001AA4C1258C8>, <function <listcomp>.<lambda> at 0x000001AA4C125950>, <function <listcomp>.<lambda> at 0x000001AA4C1259D8>, <function <listcomp>.<lambda> at 0x000001AA4C125A60>] print(v[0]) #<function <listcomp>.<lambda> at 0x000001C57BA65598> print(v[0]()) # 9 print(v[9]()) # 9
四、
单例模式,节省内存
class A: __instance = None def __new__(cls,*args,**kwargs): if cls.__instance is None: obj = object.__new__(cls) cls.__instance = obj return cls.__instance ret1 = A() ret2 = A() print( ret1 ) print( ret2 )
五、tcp 与 udp 的区别?
tcp 面向连接的 可靠的 全双工的 流式传输 面向连接 :同一时刻只能和一个客户端通信 三次握手、四次挥手 可靠的 :数据不丢失、慢 全双工 :能够双向通信 流式传输 :粘包 无边界 udp 无连接的 面向数据包 不可靠的 快速的 无连接的 :不需要accept/connect 也没有握手 面向数据包的 :不会粘包 不可靠的 :没有自动回复的机制 快速的 :没有那些复杂的计算、保证数据传输的机制
六 、生成器
def add(n, i): return n+i def test(): for i in range(4): yield i g = test() for n in [1, 10]: g = (add(n, i) for i in g) print(list(g)) # 【20,21,22,23】
七、进程,线程
进程 1、进程间内存是否共享?如何实现通讯? 2、请聊聊进程队列的特点和实现原理? 3、请画出进程的三状态转换图 4、你了解生产者模型消费者模型么?如何实现? 5、从你的角度说说进程在计算机中扮演什么角色? 线程 1、GIL锁是怎么回事? 2、在python中是否线程安全? 3、什么叫死锁? 4、logging模块是否是线程安全的? 5、threading.local的作用? 6、程序从flag a执行到falg b的时间大致是多少秒? import threading import time def _wait(): time.sleep(60) # flag a t = threading.Thread(target=_wait,daemon = False) t.start() # flag b 7、程序从flag a执行到falg b的时间大致是多少秒? import threading import time def _wait(): time.sleep(60) # flag a t = threading.Thread(target=_wait,daemon = True) t.start() # flag b 8、程序从flag a执行到falg b的时间大致是多少秒? import threading import time def _wait(): time.sleep(60) # flag a t = threading.Thread(target=_wait,daemon = True) t.start() t.join() # flag b 9、读程序,请确认执行到最后number是否一定为0 import threading loop = int(1E7) def _add(loop:int = 1): global number for _ in range(loop): number += 1 def _sub(loop:int = 1): global number for _ in range(loop): number -= 1 number = 0 ta = threading.Thread(target=_add,args=(loop,)) ts = threading.Thread(target=_sub,args=(loop,)) ta.start() ts.start() ta.join() ts.join() 10、读程序,请确认执行到最后number是否一定为0 import threading loop = int(1E7) def _add(loop:int = 1): global number for _ in range(loop): number += 1 def _sub(loop:int = 1): global number for _ in range(loop): number -= 1 number = 0 ta = threading.Thread(target=_add,args=(loop,)) ts = threading.Thread(target=_sub,args=(loop,)) ta.start() ta.join() ts.start() ts.join() 11、读程序,请确认执行到最后number的长度是否一定为1 import threading loop = int(1E7) def _add(loop:int = 1): global numbers for _ in range(loop): numbers.append(0) def _sub(loop:int = 1): global number while not numbers: time.sleep(1E-8) numbers.pop() number = [0] ta = threading.Thread(target=_add,args=(loop,)) ts = threading.Thread(target=_sub,args=(loop,)) ta.start() ta.join() ts.start() ts.join() 12、读程序,请确认执行到最后number的长度是否一定为1 import threading loop = int(1E7) def _add(loop:int = 1): global numbers for _ in range(loop): numbers.append(0) def _sub(loop:int = 1): global number while not numbers: time.sleep(1E-8) numbers.pop() number = [0] ta = threading.Thread(target=_add,args=(loop,)) ts = threading.Thread(target=_sub,args=(loop,)) ta.start() ts.start() ta.join() ts.join() 协程 1、什么是协程?常用的协程模块有哪些? 2、协程中的join是用来做什么用的?它是如何发挥作用的? 3、使用协程实现并发的tcp server端 4、在一个列表中有多个url,请使用协程访问所有url,将对应的网页内容写入文件保存 综合 1、进程和线程的区别 2、进程池、线程池的优势和特点 3、线程和协程的异同? 4、请简述一下互斥锁和递归锁的异同? 5、请列举一个python中数据安全的数据类型? 6、Python中如何使用线程池和进程池 7、简述 进程、线程、协程的区别 以及应用场景? 8、什么是IO多路复用及其作用 9、select、poll、epoll 模型的区别? 10、什么是并行,什么是并发? 11、请解释同步和异步这两个概念? 12、请谈谈对异步非阻塞的了解? 13、简述信号量的实现原理 14、程序中的阻塞有哪些?给程序带来了哪些影响? 15、请分别用多进程、多线程、协程实现生产者消费者模型?
八、
3.以下代码的输出是什么?请给出答案并解释。 def multipliers(): return [lambda x:i*x for i in range(4)] print([m(2) for m in multipliers()])
# 【6,6,6,6】 请修改multipliers的定义来产生期望的结果。
九、 不用第三方模块实现一个协程(yield)
两个任务之间的来回切换,但是遇到io阻塞无法解决 def func1(): print(1) n = yield 'a' print(n) yield 'b' def func2(): g = func1() a = next(g) print(a) b = g.send(2) print(b) func2()
生成器
def add(n,i): return n+i def test(): for i in range(4): yield add(i,1) g = test() for n in [100,100,50]: g = (add(n,i) for i in g) print(list(g)) # [151,152,153,154]
def demo(): for i in range(4): yield i g = demo() g1 = (i for i in g) g2 = (i for i in g1) print(list(g1)) print(list(g2)) #[0,1,2,3] #[]
def add(n,i):
return n+i
def test():
for i in range(4):
yield add(i,1)
g = test()
for n in [100, 100, 50]:
g = (add(n, i) for i in g)
print(list(g))
#【151,152,153,154】