程序猿面试题集锦
1、列表解析、lambda 匿名函数
value = [lambda: x + 100 for x in range(10)] print(value[0]) print(value[0]()) >>: <function <listcomp>.<lambda> at 0x0000021FBB52D9D8> 109 # 扩展 def multipliters(): """ for i in range(4): 循环4次,最终i=3 :return:[lambda x: i * x, lambda x: i * x, lambda x: i * x, lambda x: i * x] """ return [lambda x: i * x for i in range(4)] print([m(2) for m in multipliters()]) >>: [6, 6, 6, 6]
2、函数默认参数
默认参数为可变类型:
def bar(lt1,lt2 = []): lt2.append(lt1) return lt2 l1 = bar(1,[3,4]) print(id(l1),l1) l2 = bar(1) print(id(l2),l2) l3 = bar(2,[3,4]) print(id(l1),l3) l4 = bar(2) print(id(l4),l4) >>: 2542419966728 [3, 4, 1] 2542419946120 [1] 2542419966728 [3, 4, 2] 2542419946120 [1, 2]
默认参数为不可变类型:
def foo(tp1,tp2=()): return tp1+tp2 t1 = foo((1,),(3,4)) print(id(t1),t1) t2 = foo((1,)) print(id(t2),t2) t3 = foo((2,),(3,4,5)) print(id(t3),t3) t4 = foo((2,)) print(id(t4),t4) ''' 2874698184384 (1, 3, 4) 2874698241584 (1,) 2874698161992 (2, 3, 4, 5) 2874698241528 (2,) '''
3、线程、进程、协程区别
1、线程与进程的区别是什么? 进程:是最小的资源管理单元 线程是进程的具体执行单元,是CPU的最小执行单元 进程是程序的实体,线程依赖进程存在,一个进程可以有多个线程 线程的操作是由程序触发系统接口,最后的执行者是系统;协程的操作则是程序员 线程;线程的出现是为了降低上下文切换的消耗,提高系统的并发性,并突破一个进程只能干一样事的缺陷,使到进程内并发成为可能 优点:适用于I/O密集型任务 2、协程与线程的对比(使用场景,优缺点) 协程:协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。 因此:协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置。 协程的适用场景:当程序中存在大量不需要CPU的操作时(IO),适用于协程,但是在CPU密集型任务是不比python多线程好 优点:1、无需线程上下文切换的开销 2、协程不需要“锁”机制,即不需要lock和release过程,因为所有的协程都在一个线程中。 3、方便切换控制流,简化编程模型 4、高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理 缺点: 1、无法利用多核资源 2、进行阻塞(Blocking)操作(如IO时)会阻塞掉整个程序
4、类的单例模式
5.数据库设计 & 查询 ---> 表结构设计及表关联关系
6、用python实现堆栈