程序猿面试题集锦

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实现堆栈

 

posted @ 2017-10-24 15:03  hedeyong11  阅读(224)  评论(0编辑  收藏  举报