面试题(持续更新)


一、
# 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】

 

posted @ 2019-01-17 10:05  addit  Views(220)  Comments(0Edit  收藏  举报