考试题加面试常问问题

发布时间 2023-05-31 14:46:00作者: 岳宗柯

1 编写⼀个函数,接受⼀个字符串作为参数,并返回该字符串的反转结果
2 写出你知道的Python魔法⽅法及作⽤(5个以上)
def reverse_string(string):
return string[::-1]
init(self, ...): 初始化⽅法,⽤于在创建对象时进⾏初始化操作。
str(self): 返回对象的字符串表示,可以通过str(obj)或直接打印对象来调
⽤。
repr(self): 返回对象的可打印表示,⽤于调试⽬的,可以通过repr(obj)
调⽤。
len(self): 返回对象的⻓度,可以通过len(obj)调⽤。
getitem(self, key): 获取对象中指定键的值,⽤于实现索引访问,例如
obj[key]。
setitem(self, key, value): 设置对象中指定键的值,⽤于实现索引赋
值,例如obj[key] = value。
delitem(self, key): 删除对象中指定键的值,⽤于实现索引删除,例如
del obj[key]。
iter(self): 返回⼀个迭代器对象,⽤于实现对象的可迭代性。
next(self): 返回迭代器中的下⼀个元素,⽤于实现迭代器的⾏为。
call(self, ...): 将对象作为函数调⽤,可以通过obj(...)调⽤。
add(self, other): 定义对象的加法操作,例如obj1 + obj2。
sub(self, other): 定义对象的减法操作,例如obj1 - obj2。
mul(self, other): 定义对象的乘法操作,例如obj1 * obj2。
div(self, other): 定义对象的除法操作,例如obj1 / obj2。
eq(self, other): 定义对象的相等⽐较,例如obj1 == obj2。
3 解释Python中的装饰器@符号的作⽤
4 在Python中,使⽤is和 == 的区别是什么
5 什么是可变类型,什么是不可变类型,Python中那些是可变类型,那些
是不变类型
在Python中,装饰器是⼀种特殊的语法糖,⽤于可以在不修改源代码的情况下,对现
有的函数、类或⽅法进⾏功能增强、⾏为修改、代码注⼊等操作
@的⼯作原理是:它接收⼀个函数或类作为输⼊,并返回⼀个新的函数或类作为输出,
并把返回结果赋值给原函数或类
is ⽤于判断两个对象是否是同⼀个对象,⽐较的是对象的内存地址。
== ⽤于判断两个对象的值是否相等,⽐较的是对象的内容
在Python中,可变(Mutable)类型是指可以在原地改变其值的数据类型,⽽不可变
(Immutable)类型是指不能在原地改变其值,⽽是返回⼀个新的对象的数据类型。
下⾯是⼀些常⻅的可变和不可变类型:

可变类型(Mutable):

列表(List)
字典(Dictionary)
集合(Set)

不可变类型(Immutable):

整数(Integer)
浮点数(Float)
字符串(String)
元组(Tuple)
布尔值(Boolean)
6 什么是并⾏,什么是并发?
7 在Python中,创建线程的两种⽅式
并⾏是指同时执⾏多个任务,即多个任务在同⼀时刻在不同的处理单元上同时进⾏,
需要多个CPU的⽀持
并发是指多个任务交替执⾏的情况,即多个任务按照时间⽚轮转或者事件驱动的⽅式
交替执⾏,每个任务都有机会执⾏,但在任意时刻只有⼀个任务在执⾏

1 使⽤threading模块

import threading
def my_function():

线程要执⾏的代码

创建线程对象

my_thread = threading.Thread(target=my_function)

启动线程

my_thread.start()

2 继承Thread类:

import threading
class MyThread(threading.Thread):
def run(self):

线程要执⾏的代码

创建线程对象

my_thread = MyThread()

启动线程

my_thread.start()
8 画出Django请求⽣命周期
9 什么是Django中的ORM(对象关系映射)?列举⼏个常⽤的ORM查询
⽅法和过滤器
Django中的ORM(对象关系映射)是⼀种机制,⽤于将数据库表的数据映射到
Python对象,使得开发者可以使⽤⾯向对象的⽅式进⾏数据库操作,⽽⽆需直接编写
SQL语句。ORM提供了⼀组API和查询语法,简化了数据库访问和操作的过程。
以下是⼏个常⽤的ORM查询⽅法和过滤器:

查询⽅法:

all():获取模型的所有对象。
get():根据指定条件获取单个对象。
filter():根据指定条件过滤对象集合。
exclude():排除满⾜指定条件的对象。
order_by():根据指定字段对对象进⾏排序。
values():返回包含指定字段值的字典列表。
annotate():对查询结果进⾏注解,添加额外的聚合计算或注释字段。

过滤器:

exact:精确匹配,例如 field__exact=value。
10 解释⼀下Django 的MTV架构
iexact:忽略⼤⼩写的精确匹配。
contains:包含指定值的字段,例如 field__contains=value。
icontains:忽略⼤⼩写的包含匹配。
in:在指定的值列表中匹配。
gt:⼤于指定值。
lt:⼩于指定值。
gte:⼤于等于指定值。
lte:⼩于等于指定值。
startswith:以指定值开头。
endswith:以指定值结尾。
Django采⽤了⼀种名为MTV(Model-Template-View)的架构模式,与传统的MVC
(Model-View-Controller)模式有⼀些区别。下⾯对MTV架构的各个组件进⾏解
释:
Model(模型):
模型负责处理数据相关的逻辑和操作,它定义了数据模型、数据库结构以及与数据库
的交互。模型通常表示为⼀个Python类,每个模型类对应数据库中的⼀张表。模型定
义了字段(属性)和⽅法,⽤于操作和管理数据。
Template(模板):
模板是⽤户界⾯的呈现层,它负责定义⻚⾯的外观和布局。模板使⽤特定的语法和标
签来插⼊动态内容,例如变量、表达式、循环和条件语句。模板通常包含HTML和CSS
代码,允许开发者将动态数据呈现为最终的⽤户界⾯。
View(视图):
视图是处理请求并⽣成响应的中间层。视图接收来⾃⽤户的请求,从数据库或其他数
据源中获取必要的数据,并将数据传递给模板进⾏渲染。视图通常是⼀个Python函数
或类的形式,它们定义了处理请求的逻辑,并返回相应的HTTP响应
11 Django中上传⽂件代码前后端示例

下⾯是⼀个简单的Django应⽤程序中的⽂件上传的前后端代码示例:

前端(HTML模板):

{% csrf_token %}
## 后端(Django视图函数): from django.shortcuts import render def upload_file(request): if request.method == 'POST': file = request.FILES['file'] # 处理上传的⽂件 handle_uploaded_file(file) return render(request, 'upload_success.html') return render(request, 'upload_form.html') def handle_uploaded_file(file): # 在这⾥对上传的⽂件进⾏处理,例如保存到磁盘或处理⽂件内容等操作 with open('path/to/save/file.txt', 'wb') as destination: for chunk in file.chunks(): destination.write(chunk) 上述代码示例中,前端部分是⼀个包含⽂件上传表单的HTML模板。 enctype="multipart/form-data"属性是必需的,以确保可以上传⼆进制⽂件。 后端部分是⼀个Django视图函数,命名为upload_file。当请求⽅法为POST时,从 request.FILES中获取上传的⽂件对象。然后调⽤handle_uploaded_file函数对 ⽂件进⾏处理,你可以根据需求⾃定义处理逻辑。最后,返回⼀个渲染后的模板作为 响应,或者重定向到其他⻚⾯。 12 osi七层及每层功能 handle_uploaded_file函数是处理上传⽂件的逻辑部分,示例中简单地将⽂件保 存到指定路径。你可以根据实际需求进⾏相应的处理,例如处理⽂件内容、⽣成缩略 图等操作。 注意,在使⽤⽂件上传时,需要确保在form标签中包含{% csrf_token %}模板标 签,以防⽌跨站请求伪造(CSRF)攻击。 OSI(Open Systems Interconnection)是⼀个⽤于计算机⽹络体系结构的参考 模型,它定义了计算机⽹络中不同层次的功能和协议。OSI参考模型由七个层次组成, 每个层次都负责不同的⽹络功能。以下是OSI七层模型的层次及其功能: 物理层(Physical Layer): 物理层是最底层,负责在物理媒介上传输⽐特流(bits)数据。它定义了电⽓、光学 和物理接⼝的规范,包括电压、频率和传输介质等。 数据链路层(Data Link Layer): 数据链路层负责将原始的⽐特流转换为有意义的数据帧,并提供了对物理连接的控制 和错误检测。它通常使⽤MAC地址进⾏设备的寻址和帧同步。 ⽹络层(Network Layer): ⽹络层处理数据包在⽹络中的路由和转发。它负责为数据包选择合适的路径,并提供 ⽹络地址和路由协议,例如IP(Internet Protocol)。 传输层(Transport Layer): 传输层提供端到端的数据传输服务,确保可靠的数据传输和错误恢复。它负责分段和 重组数据,并提供流量控制和拥塞控制,例如TCP(Transmission Control Protocol)。 会话层(Session Layer): 会话层建⽴、管理和终⽌应⽤程序之间的会话。它提供了会话的同步和对话控制功 能,以及建⽴和维护会话期间的安全性。 13 使⽤python写⼀个简单socket客户端和服务端 表示层(Presentation Layer): 表示层处理数据的表示形式,确保在不同系统之间的数据交换的正确解释和转换。它 负责数据的加密、压缩、格式化和解析,以实现数据的独⽴性和可移植性。 应⽤层(Application Layer): 应⽤层是最⾼层,提供⽤户与⽹络的接⼝,⽀持特定应⽤程序的⽹络服务。它包括诸 如电⼦邮件、⽂件传输、远程登录和⽹⻚浏览等协议和服务。 OSI七层模型提供了⼀种分层的⽅法来组织⽹络功能,每个层次都负责特定的任务,从 底层的物理传输到⾼层的应⽤程序交互。这种分层结构使得不同的⽹络设备和协议能 够相互操作和交流,同时也为⽹络设计和故障排查提供了便利性 ##### 服务端代码(server.py)##### import socket # 创建⼀个TCP socket server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定IP地址和端⼝ server_address = ('127.0.0.1', 8888) server_socket.bind(server_address) # 监听客户端连接 server_socket.listen(1) print('等待客户端连接...') while True: # 接受客户端连接 client_socket, client_address = server_socket.accept() print('客户端已连接:', client_address) try: # 接收客户端发送的数据 data = client_socket.recv(1024) if data: print('接收到的数据:', data.decode()) # 发送响应给客户端 response = 'Hello from server!' client_socket.sendall(response.encode()) finally: # 关闭客户端连接 client_socket.close() #####客户端代码(client.py):##### import socket # 创建⼀个TCP socket client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 服务端地址和端⼝ server_address = ('127.0.0.1', 8888) # 连接到服务端 client_socket.connect(server_address) try: # 发送数据给服务端 message = 'Hello from client!' client_socket.sendall(message.encode()) # 接收服务端的响应 data = client_socket.recv(1024) print('接收到的响应:', data.decode()) finally: # 关闭socket连接 client_socket.close() 14 简述TCP和UDP区别,及TCP的三次握⼿,四次挥⼿ 以上代码示例展示了⼀个简单的Socket通信过程。服务端创建⼀个TCP socket并绑 定IP地址和端⼝,然后监听客户端连接。客户端创建⼀个TCP socket,并连接到服 务端的地址和端⼝。客户端发送数据给服务端,服务端接收数据并发送响应给客户 端,客户端接收响应并打印出来。 要运⾏以上代码,你可以在命令⾏中分别运⾏python server.py和python client.py来启动服务端和客户端。注意要确保服务端和客户端运⾏在相同的⽹络环 境下,并且服务端先于客户端启动 TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是两种常⻅的传输层协议,⽤于在计算机⽹络中传输数据。它们之间的主 要区别如下: # TCP: 提供⾯向连接的可靠数据传输。 通过建⽴连接、序列号、确认应答、重传等机制来确保数据的可靠性。 提供流量控制和拥塞控制,以避免⽹络拥塞和数据丢失。 适⽤于需要可靠数据传输的应⽤程序,如⽂件传输、电⼦邮件、Web浏览器等。 通信效率较低,因为需要维护连接状态和执⾏复杂的协议。 # UDP: 提供⽆连接的不可靠数据传输。 不保证数据的可靠性和顺序,可能会丢失、重复或乱序。 不提供流量控制和拥塞控制,数据发送和接收速度不进⾏调整。 适⽤于实时性要求⾼、数据丢失可以容忍的应⽤程序,如⾳频、视频流、在线游戏 等。 通信效率较⾼,因为不需要维护连接状态和执⾏复杂的协议。 # 三次握⼿ TCP的三次握⼿(Three-Way Handshake)是建⽴TCP连接的过程,确保客户端和 服务器之间建⽴起可靠的通信路径。三次握⼿的步骤如下: 15 什么是粘包现象,如何解决 客户端发送⼀个SYN(同步)报⽂给服务器,表示客户端请求建⽴连接。此时客户端进 ⼊SYN-SENT状态。 服务器接收到SYN报⽂后,发送⼀个SYN-ACK(同步-确认)报⽂给客户端,表示服务 器接受连接请求并准备好进⾏通信。此时服务器进⼊SYN-RECEIVED状态。 客户端接收到SYN-ACK报⽂后,发送⼀个ACK(确认)报⽂给服务器,表示客户端确 认连接建⽴。此时客户端和服务器都进⼊已建⽴连接的ESTABLISHED状态,可以开始 进⾏数据传输。 # TCP的四次挥⼿ TCP的四次挥⼿(Four-Way Handshake)是关闭TCP连接的过程,确保客户端和服 务器之间的连接正常终⽌。四次挥⼿的步骤如下: 客户端发送⼀个FIN(结束)报⽂给服务器,表示客户端不再发送数据,请求关闭连 接。此时客户端进⼊FIN-WAIT-1状态。 服务器接收到FIN报⽂后,发送⼀个ACK报⽂给客户端,确认收到FIN报⽂。此时服务 器进⼊CLOSE-WAIT状态。 服务器发送⼀个FIN报⽂给客户端,表示服务器也不再发送数据,请求关闭连接。此时 服务器进⼊LAST-ACK状态。 客户端接收到FIN报⽂后,发送⼀个ACK报⽂给服务器,确认收到FIN报⽂。此时客户 端进⼊TIME-WAIT状态。在⼀段时间后,客户端关闭连接,服务器也关闭连接,完成 连接的关闭过程。 通过三次握⼿和四次挥⼿,TCP协议可以可靠地建⽴和关闭连接,确保数据的可靠传输 和连接的正常终⽌。 粘包现象指的是在⽹络通信中,发送⽅发送的数据包在接收⽅端被粘在⼀起接收的现 象。这种现象可能会导致接收⽅⽆法正确解析和处理数据,造成数据解析错误或混 乱。 16 MySQL中的存储引擎有哪些?请简要描述每个存储引擎的特点 粘包现象的产⽣原因是由于底层的⽹络传输机制,如TCP协议,为了提⾼传输效率,可 能会对发送的数据进⾏缓冲和合并,从⽽导致接收⽅接收到的数据包⼤⼩超出了原始 发送的数据包边界。 #### 解决粘包现象的常⽤⽅法有以下⼏种: # 消息⻓度固定: 发送⽅在发送数据前,将每个数据包的⻓度固定为固定⼤⼩,接收⽅按照固定⻓度进 ⾏拆包,确保每次接收到的数据⻓度⼀致。 # 分隔符: 发送⽅在每个数据包之间添加⼀个特定的分隔符,接收⽅根据分隔符进⾏拆包。常⻅ 的分隔符可以是特定字符(如换⾏符、制表符等)或者特定字节序列。 # 消息头: 发送⽅在每个数据包中添加⼀个消息头,消息头中包含数据包的⻓度信息,接收⽅⾸ 先读取消息头,根据⻓度信息来接收正确⻓度的数据。 # 序列号/标记: 发送⽅在每个数据包中添加⼀个序列号或标记,接收⽅根据序列号或标记来区分不同 的数据包。 # 使⽤应⽤层协议: 在应⽤层使⽤特定的协议进⾏数据的封装和解析,如使⽤JSON、XML等格式对数据进 ⾏编码和解码,确保数据的完整性和正确解析。 选择适合的解决⽅法取决于具体的应⽤场景和需求。通常情况下,结合使⽤消息⻓度 固定、分隔符或消息头的⽅式可以有效解决粘包问题 # 16 MySQL中的存储引擎有哪些?请简要描述每个存储引擎的特点 MySQL中常⻅的存储引擎包括以下⼏种: # InnoDB: InnoDB是MySQL的默认存储引擎,⽀持事务和⾏级锁定。 提供了⾼并发性和⾼可靠性,适⽤于处理⼤量的写操作和并发查询。 ⽀持外键约束和提交回滚操作,保证数据的⼀致性和完整性。 # MyISAM: MyISAM是MySQL中最早引⼊的存储引擎,不⽀持事务和⾏级锁定。 具有较⾼的性能,适⽤于读密集型应⽤,如数据仓库、⽇志分析等。 ⽀持全⽂索引和压缩表,但不⽀持外键约束和崩溃恢复。 # Memory: Memory(或称为Heap)存储引擎将表数据存储在内存中,速度⾮常快。 适⽤于临时数据、缓存等⾮持久化存储的需求。 不⽀持事务和持久化,服务器重启后数据会丢失。 # Archive: Archive存储引擎⽤于存储⼤量归档数据,以提供⾼压缩⽐和快速插⼊。 适⽤于⽇志存档、审计⽇志等只需要偶尔查询的数据。 不⽀持索引、事务和更新操作,只⽀持插⼊和查询。 # CSV: CSV存储引擎以逗号分隔值的格式存储数据,适⽤于数据导⼊和导出。 不⽀持索引、事务和崩溃恢复,性能较低。 # Blackhole: Blackhole存储引擎接收数据但不将其存储,⽤于复制和分发数据。 对写操作进⾏丢弃,只⽀持读操作。 # NDB(MySQL Cluster): NDB存储引擎是MySQL Cluster的⼀部分,提供⾼可⽤性和分布式数据库功能。 ⽀持多主复制和故障恢复,适⽤于⼤规模的分布式应⽤。 每个存储引擎都有⾃⼰的特点和适⽤场景,根据应⽤需求选择合适的存储引擎可以提 供最佳的性能和功能。在选择存储引擎时,需要考虑数据的⼀致性要求、并发访问需 求、读写⽐例以及数据容量等因素 17 什么是事务?事务4⼤特性是什么? 18 什么是索引?MySQL中的索引有哪些类型? 事务是数据库管理中的⼀个概念,⽤于将⼀系列数据库操作视为⼀个独⽴的⼯作单 元,要么全部执⾏成功,要么全部回滚。事务具有以下四个特性,通常称为ACID特 性: # 原⼦性(Atomicity):事务是⼀个原⼦操作,要么全部执⾏成功,要么全部回 滚,不存在部分执⾏的情况。 # ⼀致性(Consistency):事务在执⾏前后,数据库的状态必须保持⼀致性。如果 事务执⾏失败或回滚,数据库应该回到事务执⾏前的状态。 # 隔离性(Isolation):事务的执⾏应该相互隔离,互不⼲扰。每个事务应该感知 不到其他事务的存在。 # 持久性(Durability):⼀旦事务提交成功,其对数据库的修改应该是永久性 的,即使在系统故障或重启后也不应该丢失 索引是数据库中⽤于快速查找和访问数据的数据结构。它类似于书籍的⽬录,可以通 过索引快速定位到存储在数据库表中的数据,提⾼查询性能。 在MySQL中,常⻅的索引类型包括以下⼏种: 1.主键索引(聚簇索引,PRIMARY KEY) 2.唯⼀索引(UNIQUE) 3.普通索引(辅助索引,index) 4.全⽂索引(FULLTEXT) 19 什么是迭代器 20 什么是⽣成器 迭代器(Iterator)是Python中⽤于遍历可迭代对象的⼀种机制。可迭代对象是指 那些可以被迭代的对象,例如列表、元组、字符串等。 迭代器是⼀个具有 __iter__() 和 __next__() ⽅法的对象。它通过维护⼀个内 部状态来实现遍历,每次调⽤ __next__() ⽅法都会返回可迭代对象中的下⼀个元 素,直到没有元素可迭代时引发 StopIteration 异常。 # 迭代器的⼯作原理如下: ⾸先,使⽤ iter() 函数获取可迭代对象的迭代器,即调⽤可迭代对象的 __iter__() ⽅法。 然后,使⽤ next() 函数或迭代器的 __next__() ⽅法来获取下⼀个元素,即调 ⽤迭代器的 __next__() ⽅法。 如果迭代器已经迭代完所有元素,会引发 StopIteration 异常。 迭代器的优势在于可以逐个访问元素,⽽不需要提前将所有元素加载到内存中,从⽽ 节省内存空间。此外,迭代器还可以⽤于⾃定义对象的迭代⾏为,提供了更⼤的灵活 性。 在Python中,很多内置函数和语句都使⽤了迭代器,例如 for 循环、list()、 tuple()、dict() 等。此外,还可以通过⾃定义类来实现迭代器接⼝,使对象⽀持 迭代操作。 ⽣成器(Generator)是⼀种特殊的迭代器,它使⽤函数的⽅式来定义,⽽不是通过 类来实现。⽣成器函数在调⽤时返回⼀个迭代器对象,通过 yield 关键字产⽣值, 可以暂停函数的执⾏并在需要时恢复执⾏。 ⽣成器的特点如下: 使⽤函数定义:⽣成器是使⽤函数定义的,通过 def 关键字定义⽣成器函数。 惰性计算:⽣成器采⽤惰性计算的⽅式,只在需要时⽣成值,⽽不是⼀次性⽣成所有 值,从⽽节省内存空间。 状态保存:⽣成器可以保存⾃⼰的内部状态,每次调⽤⽣成器的 next() ⽅法或使⽤ for 循环时,会从上⼀次暂停的位置继续执⾏。 迭代器接⼝:⽣成器是迭代器的⼀种,具有 __iter__() 和 __next__() ⽅法, 可以使⽤ for 循环或内置函数 next() 进⾏遍历。 ⽣成器的定义形式为⼀个普通的函数,使⽤ yield 关键字来产⽣值。每次调⽤⽣成 器的 next() ⽅法或使⽤ for 循环时,函数会从上⼀次 yield 语句的位置开始 执⾏,直到遇到下⼀个 yield 语句或函数结束。 ⽣成器可以⽤于处理⼤量数据、⽆限序列、延迟计算等场景,因为它们可以逐个⽣成 值并在需要时提供。此外,⽣成器的定义简洁,易于理解和使