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解释器的特性