python 面试基础考试题收集


默认参数
#
如果默认参数的值是一个可变数据类型,那么每次调用函数的时候,如果不传值就公用这个数据类型的资源 def f(k, l = {}): l[k] = 'a' print(l) f(1) #{1:a} f(2) #{1:a, 2:a} f(3) #{1:a, 2:a, 3:a}
生成器相关
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)) # [0,1,2,3] print(list(g2)) # [] # 生成器只能取一次值再取就空了

 

生成器表达式相关、生成器

生成器是在调用时才真的执行代码
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) # n = 1 # g = (add(n,i) for i in (0,1,2,3)) # n = 10 # g = add(10,i) for i in g => add(10,i) for i in (add(n,i) for i in (0,1,2,3)) 在list(g)是生成器才真正去执行,此时n = 10 # g = add(10,i) for i in (add(10,i) for i in (0,1,2,3)) # g = add(10,i) for i in (10, 11, 12, 13) # g = (20,21,22,23) print(list(g)) # list(g) 才开始执行此时n =10
# [20, 21, 22, 23]

 接口类和抽象类的区别

 #从java的角度看是有区别的
    # java没有多继承所以为了接口隔离原则就设计了接口这个概念,支持多继承了
    # java本来就支持单继承 所以就有了抽象类
# python中既支持单继承也支持多继承,所以对于接口类和抽象类的区别就不那么明显了
# 甚至在python中没有内置接口类

 

arp 协议是如通过ip地址去找mac地址的

A机器找B机器,A机器把请求发给交换机,交换机把这件事广播出去,告诉所有机器说要找B机器,
其他机器接收到这条消息,会把消息的ip地址对比是不是自己的ip地址,如果不是就丢弃掉,
如果找的机器是B机器,既ip是同一个ip,此机器就把mac地址发给交换机,交换机再把这个mac地址返回给A机器
# ip tcp udp  arp分别属于osi七层中的那一层
#ip协议:网络层
# tcp udp协议属于  传输层
# arp协议属于 数据链路层

 

TCP协议为什么是三次握手四次挥手

因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。
其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,
所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"
只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

 为什么会出现黏包现象

 为什么会出现黏包现象
     首先只有tcp协议中才会出现黏包现象
     是因为tcp协议是面向流的协议
     在发送的数据传输的过程中还有缓存机制来避免数据丢失
     因此 在连续发送小数据的时候,以及接收大小不符合的时候都容易出现黏包现象
     本质还是因为我们在接收数据的时候不知道发送的数据的长短
如何解决黏包问题
  在传输大量数据之前告诉接收端要发送的数据大小
  如果想更漂亮的解决问题,可以通过struct模块来定制协议

 什么是全局解释器锁-GIL

在Cpython解释器中 同一时刻只能有一个线程访问cpu 
锁的是线程
是Cpython解释器的特性

 



posted @ 2019-05-14 17:32  方大象  阅读(222)  评论(0编辑  收藏  举报