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模板):
## 后端(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 语句或函数结束。
⽣成器可以⽤于处理⼤量数据、⽆限序列、延迟计算等场景,因为它们可以逐个⽣成
值并在需要时提供。此外,⽣成器的定义简洁,易于理解和使