python面试的基础知识总结

自己总结的面试中大概率被问到的知识,经验就是王道

1.utf-8中中文占几个字节

  • unicode 万国码 支持所有国家语言是编码字符集 Utf-8 可变字节码 中文大多数占3个字节 超大字符占4个字符 GBK、gb2312中文 占两个字节

2.如何在不使用第三个变量的情况下,将a,b的值进行交换

第一种方法
a=1, b=2 
a = a+b
b = a-b
a = a-b

第二中方法
a=1, b=2
a,b = b,a

3.如何快速的将两个列表转化成一个字典

In [3]: a = [1,2,3]

In [4]: b =[11,22,33]

In [5]: c = dict(zip(a,b))

In [6]: c
Out[6]: {1: 11, 2: 22, 3: 33}

4.怎么理解python中的引用

在python中,值是靠引用来传递的,引用是是指向一个内存起始地址的。

5.匿名函数的意义

当写一段简单的代码时,可以用匿名函数来写。好处时,传递不同的匿名函数,可以出执行不同的效果。

6.面向函数的三大特性

封装:一个函数一个功能,类是相关函数的集合。根据职责的不同将属性和方法封装到一个类里。
继承:这是设计类的技巧,父与子。主要体现了去除重复性代码。子类可以调用父类的方法。私有的除外。
多态:不同的子类对象调用相同的父类方法会执行出不同的效果来。在保证安全的前提下,提高了方法调用的灵活性。是以继承和重写父类的方法为基础的。

7.两个函数之间如何实现数据的共享

第一种:全局变量的方法
第二种:return返回值

8.简单描述tcp与udp的不同

1. TCP: 传输控制协议, 面向连接可靠的传输协议, Transmission Control Protocol
2. UDP: 用户数据报协议, 不面向连接不能保证数据的可靠性,但是传输速度快,占用资源少,User Datagram Protocol
3. TCP的特点:
    3.1 面向连接, 间接验证ip地址有效性
    3.2 可靠的传输
        3.2.1 应答机制:对方收到消息,底层会回复
        3.2.2 超时重传:对方收到数据没有回复那么会再次给对方发送数据,如果对方一直不回复那么会认为对方掉线
        3.2.3 错误校验:比如接收的数据的序号和发送时候的数据序号不一致,那么tcp会对数据包进行自动排序, 如果收到重复的数据包会删除
        3.2.4 流量控制:对方发送大量数据如果接收方网卡缓存区达到一定上限,那么就不让对方发送数据,等接收方把数据处理完以后再发送,保证电脑接收数据不会卡死
4. TCP和UDP的不同点
    4.1 tcp面向连接, udp不面向连接
    4.2 tcp可靠的传输协议,udp 不可靠
    4.3 tcp 应答机制, udp没有
    4.4 tcp 超时重传,udp没有
    4.5 tcp 流量控制, udp没有
    4.6 tcp 错误校验, udp没有
    4.7 udp 适合做广播, tcp不适合
    4.8 udp传输速度比tcp传输速度要快, udp占用的资源要比tcp的占用资源要少
    4.9 udp 每次发送的数据包不能太大,上限是64k, tcp理论上没有限制 —扩展
    4.10 tcp适合文件的上传和下载,绝大多数应用都是使用tcp的
    4.11 udp 适合音视频(qq,微信)的传输,还有飞秋上线广播

9. 网络中的四层或七层协议

四层:
    应用层
    传输层--udp,tcp
    网络层--arp(通过ip找mac地址),rarp(根据mac地址找ip),ip,icmp(ping 一个主机时 会用到的协议)
    链路层
七层:
    应用层
    展示层
    会话层
    传输层
    网络层
    物理链路层
    物理层

10.解释一下tcp中的三次握手和四次挥手

三次握手

第一次:客户端发送SYN(标志位为1的连接请求),和seq=j的报文序号给服务端,等待确认
第二次:服务端收到客户端发来的数据后,回给一个SYN(标志位为1的连接请求)和seq = k,  并返回ACK( 标志位为1)和ack = j+1的确认值用来同意是seq=j发来的请求
第三次:客户端收到后,通过返回的ack的值来判断是否为自己发送的连接请求,并返回ACK和ack=k+1的值来同意建立连接,服务端确认ACK的值k+1是否正确, 若正确则此时才可以发送数据

四次挥手

第一次:客户端发送一个FIN(标志位为1)和seq=j的报文序号的关闭请求,等待确认
第二次:服务端收到后,返回ACK(标志位为1)和 ack = j+1的确认值给客户端。并告诉说,服务端处理完后再关闭连接
第三次:服务端再次想客户端发送一个FIN(标志位 为1 )和seq=k,的关闭请求,说明已经处理完,可以关闭连接
第四次:客户端接收 到ACK后,确认为自己发送的请求后,发送给服务端ACK(标志位1)和ack = k+1的确认,说明同意断开。此时断开连接

11.线程、进程、协程之间的区别

线程是cup调度的基本单位,进程是系统分配资源的基本单位。进程之间是相互独立的,线程则不是。协程是在不开辟线程的情况下执行多任务。
Ⅰ: 先有进程,进程里默认有一条线程,可以创建多个线程,线程里可以包含多个协程,都是用来完成多任务的。协程需要的资源最少大概只有5k,线程大概512k,进程则需要更多。
Ⅱ: 进程是不共享全局变量的,线程和协程共享全局变量。但在线程中共享全局变量中需要注意数据的竞争和数据不准确,则在使用的时候有两种方法 1:线程等待(用join),又叫线程同步。2:互斥锁( lock = threading.Lock() )方法来加锁,能保证同一时刻只有一个线程去执行任务。当然这种情况会使性能下降。
Ⅲ:多进程开发要比单进程多线程开发稳定,但是消耗资源也大。
Ⅳ: 多进程、多线程之间执行任务时无序的,而协程是按照一定的顺序执行的。

12.GIL是什么,怎么解决这个问题

叫什么:全局解释器锁--在cpython中
有什么用:单核的情况下实现多任务
怎么解决:
    换解释器锁jpython
    进程加协程(个人建议)
    线程用其他语言实现,python调用
现在的影响:因为当时吉多在设计的时候还是单核cpu,用GIL来实现单核的情况下执行多任务。但现在都是多核处理器,当用多线程的时候,多核cpu达不到多核的效果,因为GIL会保证同一时刻只有一个线程能使用到cpu,导致了不能完全利用cpu。

后续继续更新相关的面试知识

猜你喜欢

转载自blog.csdn.net/gllaxq/article/details/80272913