2024年Python最新python面试题(1),2024年最新科学技术协会面试真题

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!


63、1、2、3、4、5 能组成多少个互不相同且无重复的三位数



for x in range(1, 5):
for z in range(1, 5):
for i in range(1, 5):
if i != x and i != z and x != z:
print(i, x, z)


64、什么是反射?以及应用场景?



反射就是通过字符串的形式,导入模块;通过字符串的形式,去模块寻找指定函数,并执行。利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动!

  1. getattr()函数是Python自省的核心函数,具体使用大体如下:
    class A:
    def init(self):
    self.name = ‘twiss’
    #self.age=‘24’
    def method(self):
    print"method print"
    Instance = A()
    print getattr(Instance , ‘name, ‘not find’) #如果Instance 对象中有属性
    name则打印self.name的值,否则打印’not find’
    print getattr(Instance , ‘age’, ‘not find’) #如果Instance 对象中有属性
    age则打印self.age的值,否则打印’not find’
    print getattr(a, ‘method’, ‘default’) #如果有方法method,否则打印其地址,
    否则打印default
    print getattr(a, ‘method’, ‘default’)() #如果有方法method,运行函数并
    打印None否则打印default

  2. hasattr(object, name)
    说明:判断对象object是否包含名为name的特性(hasattr是通过调用getattr(ojbect, name)
    是否抛出异常来实现的)

  3. setattr(object, name, value)
    这是相对应的getattr()。参数是一个对象,一个字符串和一个任意值。字符串可能
    会列出一个现有的属性或一个新的属性。这个函数将值赋给属性的。该对象允许它提供
    。例如,setattr(x,“foobar”,123)相当于x.foobar = 123。

  4. delattr(object, name)
    与setattr()相关的一组函数。参数是由一个对象(记住python中一切皆是对象)和一
    个字符串组成的。string参数必须是对象属性名之一。该函数删除该obj的一个由string
    指定的属性。delattr(x, ‘foobar’)=del x.foobar


67、metaclass作用?以及应用场景?



元类就是创建类这种对象的东西
当python在执行带class语句的时候,会初始化一个类对象放在内存里面。例如这里会初始化一个Trick对象

这个对象(类)自身拥有创建对象(通常我们说的实例,但是在python中还是对象)的能力。
1.类由type创建,创建类时,type的__init__方法自动执行,类() 执行type的 __call__方法(类的__new__方法,类的__init__方法)
2.对象由类创建,创建对象时,类的__init__方法自动执行,对象()执行类的 call 方法


68、用尽量多的方法实现单例模式。



单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。

比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息。如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConfig 对象的实例,这就导致系统中存在多个 AppConfig 的实例对象,而这样会严重浪费内存资源,尤其是在配置文件内容很多的情况下。事实上,类似 AppConfig 这样的类,我们希望在程序运行期间只存在一个实例对象。
实现单例模式的几种方式
使用模块
其实,Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。如果我们真的想要一个单例类,可以考虑这样做
class Singleton(object):
def foo(self):
pass
singleton = Singleton()
将上面的代码保存在文件 mysingleton.py 中,要使用时,直接在其他文件中导入此文件中的对象,这个对象即是单例模式的对象
from a import singleton


69、装饰器的写法以及应用场景。



装饰器是一个工厂函数,接受一个函数作为参数,然后返回一个新函数,
其闭包中包含被装饰的函数。有了装饰器,
可以提取大量函数中与本身功能无关的类似代码 ( 这块在Flask中用于定义路由的@app.route,就是一个很好的例子),达到代码重用的目的。
可应用于插入日志、性能测试、事务处理等方面。

def deco(func):
def warpper(*args, **kwargs):
print(‘start‘)
func(*args, **kwargs)
print(‘end‘)
return warpper

@deco
def myfunc(parameter):
print(“run with %s” % parameter)

myfunc(“something”)


70、异常处理写法以及如何主动跑出异常(应用场景)



try:
pirnt(‘123’)
except:
print(‘456’)
通过raise 异常对象主动抛出异常


71、什么是面向对象的mro



Method Resolution Order 用来制作一个继承关系的列表
MRO列表的制作原则:
1.子类永远在父类的前面
2.如果继承了多个父类,那么按照()中的顺序在列表中摆放
3.如果多个类同时继承了一个父类,孙子类中只会选取第一个父类中的父类的该方法


72、isinstance作用以及应用场景?



检测一个数据是否由指定的类型创建


73、写代码并实现:



Given an array of integers, return indices of the two numbers such that they add up to a specific target.You may assume that each input would
have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,

return [0, 1]

def nums(lists, n):
if isinstance(lists, list):
for i in range(len(lists)):
for v in lists:
if lists[i] + v == n:
print(i, lists.index(v))
break


74、json序列化时,可以处理的数据类型有哪些?如何定制支持datetime类型?



#字符串、字典、列表、数字、布尔值、None、、自定义class类
import json
import datetime

class MyEncoder(json.JSONEncoder):
def default(self, o): # o是数据类型
if isinstance(o, datetime.datetime)
return o.strftime(‘%Y-%m-%d’)
else:
return super(MyEncoder, self).default(o)


75、json序列化时,默认遇到中文会转换成unicode,如果想要保留中文怎么办?



json.dumps(jsonData,ensure_ascii=False);


76、什么是断言?应用场景?



在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃,不如在出现错误条件时就崩溃,这时候就需要assert断言的帮助

python assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假。可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触发异常。

断言条件为真时,代码继续执行,负责抛出异常,这个异常通常不会去捕获他,我们设置一个断言目的就是要求必须实现某个条件。

assert True


77、有用过with statement吗?它的好处是什么?



with语句的作用是通过某种方式简化异常处理
自动管理文件关闭


78、使用代码实现查看列举目录下的所有文件。



1递归方法

def print_directory_contents(sPath):
import os
for sChild in os.listdir(sPath):
sChildPath = os.path.join(sPath,sChild)
if os.path.isdir(sChildPath):
print_directory_contents(sChildPath)
else:
print(sChildPath)

print_directory_contents(‘./test/’)

#2
tapath = ‘./test/’
for i in os.listdir(tapath):
print(i)


79、简述 yield和yield from关键字。



yield 的作用就是把一个函数变成一个生成器, 带有yield的函数不再是一个普通的函数。python解释器会将其视为一个generator
yield:生成器函数关键字
yield from:相当于 for i in obj : yield i

def a():
yield 1
def b():
yield from a()


80、求结果



def num():
return [lambda x:i*x for i in range(4)]
print([m2 for m in num()])

[6, 6, 6, 6]


## 第二部分 网络编程和并发(34题)


1、简述 OSI 七层协议。



1、物理层
为数据链路层提供物理连接,实现比特流的透明传输,所传输数据的单位是比特,该层定义了通信设备与传输线接口硬件的电气、机械以及功能和过程的特性。
2、数据链路层
在通信的实体之间建立数据链路连接,传送以帧为单位的数据,通过检查发生在连接通信系统间传送路上的比特错误并进行恢复,确保比特序列组成为数据流准确无误地传送给对方的系统。数据链路层在相邻的节点之间实现透明的高可靠性传输。
3、网络层
解决多节点传送时的路由选择、拥挤控制及网络互连等,控制分组传送系统的操作,它的特性对高层是透明的,同时,根据传输层的要求选择服务质量,并向传输层报告未恢复的差错。
4、传输层
为两个端系统(源站和目标站)的会话层之间建立一条传输连接,可靠、透明地传送报文,执行端一端差错控制、顺序和流量控制、管理多路复用等。本层提供建立、维护和拆除传送连接的功能,并保证网络连接的质量。它向高层屏蔽了下层数据通信的细节,因而是OSI网络参考模型中最需要的一层。
5、会话层
不参与具体的数据传输,但对数据传输的同步进行管理。它主要负责提供两个进程之间建立、维护和结束会话连接功能,同时要对进程中必要的信息传送方式、进程间的同步以及重新同步进行管理。
6、表示层
解决在两个通信系统中交换信息时不同数据格式的编码之间的转换,语法选择,数据加密与解密及文本压缩等。
7、应用层
负责向用户提供各种网络应用服务,如文件传输、电子邮件、远程访问等。把进程中于对方进程通信的部分放入应用实体中,同时,对各种业务内容的通信功能进行管理。


2、什么是C/S和B/S架构?



C/S架构软件(即客户机/服务器模式)分为客户机和服务器两层:第一层是在客户机系统上结合了表示与业务逻辑,第二层是通过网络结合了数据库服务器。简单的说就是第一层是用户表示层,第二层是数据库层。客户端和服务器直接相连,这两个组成部分都承担着重要的角色。
B/S型模式,即浏览器/服务器结构。它是C/S架构的一种改进,可以说属于三层C/S架构。主要是利用了不断成熟的WWW浏览器技术,用通用浏览器就实现了原来需要复杂专用软件才能实现的强大功能,并节约了开发成本,是一种全新的软件系统构造技术。


3、简述 三次握手、四次挥手的流程。



所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发

  1. 第一次握手:
    Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
  2. 第二次握手:
    Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
  3. 第三次握手:
    Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发

第一次挥手:
Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
第二次挥手:
Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
第三次挥手:
Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
第四次挥手:
Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。


4、什么是arp协议?



地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。


5、TCP和UDP的区别?



基于连接与无连接
TCP要求系统资源较多,UDP较少;
UDP程序结构较简单
流模式(TCP)与数据报模式(UDP);
TCP保证数据正确性,UDP可能丢包
TCP保证数据顺序,UDP不保证


6、什么是局域网和广域网?



局域网和广域网是按规模大小而划分的两种计算机网络。范围在几千米以内的计算机网络统称为局域网;而连接的范围超过10千米的,则称为广域网,因特网(Intenet)就是目前最大的广域网。


7、为何基于tcp协议的通信比基于udp协议的通信更可靠?



TCP的可靠保证,是它的三次握手双向机制,这一机制保证校验了数据,保证了他的可靠性。而UDP就没有了,udp信息发出后,不验证是否到达对方,所以不可靠。


8、什么是socket?简述基于tcp协议的套接字通信流程。



Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。


9、什么是粘包? socket 中造成粘包的原因是什么? 哪些情况会发生粘包现象?



指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。出现粘包现象的原因是多方面的,它既可能由发送方造成,也可能由接收方造成。

socket粘包:

socket 交互send时,连续处理多个send时会出现粘包,soket会把两条send作为一条send强制发送,会粘在一起。

send发送会根据recv定义的数值发送一个固定的数值,如果最后一次,所剩的数值小于recv定义数就会连带两条send数据同时发送,发生粘包状况。

解决方案:

方案1:可以使用time.sleep 在两send之间加上时间(不建议)

方案2:可以在send两条之间加入一条 conn.recv(1024)


10、IO多路复用的作用?



I/O多路复用是通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。

首先,输入操作一般包含两个步骤:

等待数据准备好(waiting for data to be ready)。对于一个套接口上的操作,这一步骤关系到数据从网络到达,并将其复制到内核的某个缓冲区。

将数据从内核缓冲区复制到进程缓冲区(copying the data from the kernel to the process)。

阻塞I/O模型
非阻塞I/O模型
I/O复用模型
正因为阻塞I/O只能阻塞一个I/O操作,而I/O复用模型能够阻塞多个I/O操作,所以才叫做多路复用。


11、什么是防火墙以及作用?



简单的来说,防火墙就是一种,避免你的电脑被黑客入侵的一种防护工具,一种确保网络安全的方法!
1.允许网络管理员定义一个中心点来防止非法用户进入内部网络。
2.可以很方便地监视网络的安全性,并报警。
3.可以作为部署NAT(Network Address Translation,网络地址变换)的地点,利用NAT技术,将有限的IP地址动态或静态地与内部的IP地址对应起来,用来缓解地址空间短缺的问题等


12、select、poll、epoll 模型的区别?



1)select,poll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替。而epoll其实也需要调用 epoll_wait不断轮询就绪链表,期间也可能多次睡眠和唤醒交替,但是它是设备就绪时,调用回调函数,把就绪fd放入就绪链表中,并唤醒在 epoll_wait中进入睡眠的进程。虽然都要睡眠和交替,但是select和poll在“醒着”的时候要遍历整个fd集合,而epoll在“醒着”的 时候只要判断一下就绪链表是否为空就行了,这节省了大量的CPU时间。这就是回调机制带来的性能提升。

(2)select,poll每次调用都要把fd集合从用户态往内核态拷贝一次,并且要把current往设备等待队列中挂一次,而epoll只要 一次拷贝,而且把current往等待队列上挂也只挂一次(在epoll_wait的开始,注意这里的等待队列并不是设备等待队列,只是一个epoll内 部定义的等待队列)。这也能节省不少的开销。


13、简述 进程、线程、协程的区别 以及应用场景?



进程拥有自己的堆和栈,既不共享堆也不共享栈 进程由操作系统调度

线程拥有自己的堆和共享的栈 共享栈 但不共享堆 线程也是由操作系统调度

协程和线程一样有自己的堆和共享的栈 共享栈但不共享堆 协程由开发人员在适当情况调用


14、GIL锁是什么鬼?



GIL:全局解释器锁。当我们用多线程的时候,
每一个进程中只有一个GIL锁,那么这多个线程中谁拿到GIL锁,
谁即可以用cpu(ps:多个进程有多个Gil锁,但每个进程中只有一个GIL)


15、Python中如何使用线程池和进程池?



进程池:使用multiprocessing.Pool
线程池:使用ThreadPool模块


16、threading.local的作用?



threadLocal解决了参数在一个线程中各个函数之间相互传递的问题
一个threadLocal变量虽然是全局变量,但每个线程都只能读写自己线程的独立副本 互不干扰


17、进程之间如何进行通信?



创建一个queue队列,或使用 from multiprocessing import Manage管理要进行通信的数据


18、什么是并发和并行?



并发(concurrency)和并行(parallellism)是:

解释一:并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。

解释二:并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。

解释三:在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如hadoop分布式集群

所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。


19、进程锁和线程锁的作用?



当多进程或多线程是不用进程访问相同一个变量
是会造成同一时间执行相同的事 而得不到正确的结果 所以需要用锁锁上这个全局变量,
当某一个进程或线程访问时其他进程或线程均无法访问


20、解释什么是异步非阻塞?



异步双方不需要共同的时钟,也就是接收方不知道发送方什么时候发送,
所以在发送的信息中就要有提示接收方开始接收的信息,如开始位,同时在结束时有停止位。
非阻塞模式是指利用socket事件的消息机制,Server端与Client端之间的通信处于异步状态。


21、路由器和交换机的区别?



一、工作所在的OSI层次不一样(根本区别,导致接下来的区别)
交换机工作在 OSI模型的数据链路层,所以工作原理比较简单;
路由器工作在OSI模型的网络层,具备更多的网络协议信息,所以可以做出更好的数据转发策略。

二、数据转发所依据的对象也不一样。
交换机工作在数据链路层,所以交换机转发数据依靠的是每个物理地址(MAC地址),MAC地址一般是设备生产商在设备出厂时固定在设备中的,不能进行更改。
路由器工作在网络层,所以其交换数据依靠网络地址(IP地址),而IP地址是由网络管理员自己分配或者系统自动获取的。

三、是否可以分割广播域
由交换机连接的所有端口仍然属于同一个广播域,所以极有可能会产生数据拥堵;
连接到路由器上的所有端口不在属于同一个广播域,所以不会产生类似的数据拥堵问题。


22、什么是域名解析?



域名解析是把域名指向网站空间IP,让人们通过注册的域名可以方便地访问到网站的一种服务


23、如何修改本地hosts文件?



127.0.0.1 localhost

::1 localhost

127.0.0.1 www.gkate.com
修改后用浏览器访问“www.gkate.com”会被解析到127.0.0.1,导致无法显示该网页


24、生产者消费者模型应用场景及优势?



应用于一个生产数据一个处理数据的场景
优势生产者和消费者之间不直接进行通信 而是通过一个队列相当于一个缓冲区,
平衡了生产者和消费者的处理能力


25、什么是cdn?



尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,
使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、
负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。


26、LVS是什么及作用?



LVS 是 Linux Virtual Server ,Linux 虚拟服务器;是一个虚拟的服务器集群【多台机器 LB IP】。LVS 集群分为三层结构:

负载调度器(load balancer):它是整个LVS 集群对外的前端机器,负责将client请求发送到一组服务器[多台LB IP]上执行,而client端认为是返回来一个同一个IP【通常把这个IP 称为虚拟IP/VIP】
服务器池(server pool):一组真正执行client 请求的服务器,一般是我们的web服务器;除了web,还有FTP,MAIL,DNS
共享存储(shar

  • 29
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值