python面试题整理

news2025/2/22 20:20:55

Python 如何处理异常?

Python中,使用try 和 except 关键字来捕获和处理异常

try 块中放置可能会引发异常的代码,然后在except块中处理这些异常。

能补充一下finally的作用吗?

finally 块中的代码无论是否发生异常都会执行,通常用于清理资源。

补充一下 except后使用的else子句的作用是什么呢?

当代码未发生任何异常时,才会执行else块中的代码

在这里插入图片描述

你平时如何管理Python项目中的依赖库?

1、使用 requirements.txt,该文件会列出项目所需的所有依赖及其版本。

  • 生成依赖文件:

    pip freeze > requirements.txt
    
  • 安装依赖库:

    pip install -r requirements.txt
    

2、使用虚拟环境(Virtual Environment)即:venv

  • 使用 venv 创建虚拟环境:

    python -m venv env
    
  • 激活虚拟环境:

    # windows
    .\env\Scripts\activate
    # macOs/Linux:
    source env/bin/activate
    
  • 安装依赖:激活虚拟环境后,可以使用pip 安装项目所需的依赖:

    pip install <package-name>
    
  • 退出虚拟环境:如果你完成了工作,可以通过一下命令退出虚拟环境:

    deactivate
    

3、使用conda(Anaconda)

  • 使用 conda ,创建一个新的环境并安装依赖:

    conda create --name myenv python=3.x
    conda activate myenv
    conda install <package-name>
    

4、使用Pipenv

5、使用poetry

你平常会用什么工具来进行Python代码调试呢?

Pycharm,Pycharm 的调试器确实很强大,可以帮助你快速定位问题,你觉得PyCharm在开发中还有哪些特别有用的功能?

Pycharm 支持语法提示、代码自动填充、大大提高开发效率。

PyCharm 还支持代码重构、版本控制、以及各种插件。

在Python中,如何判断一个字符串回文呢?

可以通过反转字符串或直接使用切片来判断。

1、使用切片

s = "hello"
reversed_s = s[::-1]
print(reversed_s)  # 输出: 'olleh'

2、使用 reversed()函数 结合 join()方法

s = "hello"
reversed_s = ''.join(reversed(s))
print(reversed_s)  # 输出: 'olleh'

你平时有用过Python的装饰器吗?你觉得它们有什么用?

装饰器可以帮助减少重复代码,并增强代码的可复用性,还可以用于日志记录、权限认证、性能分析等场景。

装饰器是用来修改函数或方法行为的工具。它允许你在不改变函数内部代码的情况下,在函数执行前后添加额外逻辑。通常使用@符号来应用,比如@decorator

实例如下:

def my_decorator(func):
	def wrapper():
		print("调用函数前进行的操作")
		func()
		print("调用函数后进行的操作")
	return wrapper

@my_decorator
def say_hello():
	print("Hello!")

say_hello()

你平时有用过python的生成器吗?你觉得他们有什么优点?

Python的生成器使用yield关键字,可以在迭代中节省内存,因为它们按需生成数据。

生成器适合处理大量数据或需要延迟计算的场景,比如读取大文件或处理无限序列时,生成器就很有用。

当你需要遍历一个非常大的文件或数据流时,可以用生成器来逐行读取,避免一次性加载到内存中。另外,生成器也常用于实现复杂的迭代逻辑,比如生成斐波那契数列等。

你有使用过python的上下文管理器吗?比如with语句,它的作用是什么?

with语句能自动管理资源,避免遗忘关闭文件等操作,减少潜在错误,无论代码块是否正常结束,都会执行清理操作(比如关闭文件、释放锁)。

你在python中使用过多线程和多进程吗?你觉得它们各自的优点和应用场景是什么?

多线程适用于I/O密集型任务,比如爬虫、数据库查询、网络请求或文件读写,因为它能让程序在等待I/O操作时继续执行其他任务。python的GLI(全局解释锁)限制了python线程的并行计算能力,因此多线程不适用于CPU密集型任务。

而多进程适合CPU密集型任务,比如计算密集型操作(科学计算、视频处理、数据分析等),因为每个进程都有一个独立的python解释器,可以绕过GIL,充分利用多核CPU。

进程(process)、线程(thread)和协程(coroutine)之间的关系是什么?

进程 ——包含多个——线程——包含多个——协程

进程:是操作系统分配资源的基本单位,每个进程拥有独立的地址空间、可以看作是一个独立的程序来运行。进程可以包含多个线程,即“进程中使用线程”。但通常不会是“线程中使用进程”,因为线程本身不能独立与进程存在。

线程:运行在进程内部,多个线程共享进程的资源,如内存、文件等。线程是由操作系统调度的,切换时有线程上下文切换的开销。

协程是一种 用户态的轻量型线程,由程序本身调度,不会引起操作系统级别的线程切换,所以开销更低。协程适用于高并发I/O任务,比如使用asyncio处理异步网络请求。

python中的闭包是什么?它是如何工作的呢?

闭包是指一个函数对象,它不仅包含函数的代码,还记录着定义函数时的作用域。

当一个函数在其外部作用域引用了局部变量,即使外部函数执行完毕,这些变量仍然会保存在内存中。这使得闭包可以用来记住某些状态或数据,非常适合用在回调函数和装饰器中。

闭包的用途包括保持状态和数据封装,可以用于创建工厂函数,生成不同配置的函数实例。此外,它还能实现数据的延迟计算和回调函数,使代码更加简洁和模块化。通过闭包,你可以将相关的行为和数据绑定在一起,使得代码更加清晰。

实例:创建一个生成计数器的闭包:

# 这个make_counter 函数会返回一个counter 函数 ,
# 每调用一次 counter ,计数器就会加1.
def make_counter():
	count = 0
	def counter():
		nonlocal count
		count += 1
		return count
	return counter

请你谈一谈在python 中如何进行内存管理?有哪些机制可以帮助优化内存使用?

在python 中,内存管理主要依赖于自动垃圾回收机制。python使用引用计数来跟踪对象的使用情况,当引用计数为零时,内存会被回收。此外,还有一个垃圾回收器,用于处理循环引用。还有内存池机制,用于管理小对象的内存分配,减少内存碎片。了解这些机制可以帮助优化程序的内存使用,编写更高效的代码。

range() 和 xrange() 有什么区别?

在python2 中使用xrange() ,会返回一个生成器;使用range(),返回一个list对象。

在python3 中使用,range()返回的是一个迭代器,而不是列表,这样可以节省内存。它用于生成一个数字序列。相比python2中的range(),它更高效。xrange()函数在python3中已经被移除了。所以只有 range()函数;

你能简单解释一下Python3中的列表和元组有什么区别吗?

python 中的列表是可变数据类型,元组是不可变数据类型,列表的话有增加、删除元素操作。元组的长度是固定的。

固定的数组或配置时,用元组更合适,比如表示经纬度、数据库中心的键值对等。因为它不可变,能保证数据的安全性。

python 中的字典有哪些常用操作?如何添加、更新或删除键值对?

1、创建字典

可以使用花括号{} 或 dict() 函数来创建字典

# 使用花括号
my_dict ={"a":1,"b":2,"c":3}

# 使用dict() 函数
my_dict2 = dict(a=1, b=2, c=3)

2、添加键值对

通过赋值的方式,可以直接向字典添加新的键值对

my_dict = {"a": 1, "b": 2}
my_dict["c"] = "3"
print(my_dict) # 输出:{'a': 1,'b': 2,'c': 3}
3、更新键值对

如果键已经存在,可以直接修改其值。也可以使用update()方法来批量更新字典

# 直接修改其值
my_dict = {"a": 1,"b": 2}
my_dict["a"] = 10  # 更新键 “a” 的值
print(my_dict)  # 输出:{'a': 10, 'b': 2}

# update() 方法批量更新字典
my_dict.update({"b": 20,"c": 30})  # 更新多个键值对
print(my_dict)  # 输出:{'a': 10, 'b': 20,'c': 30}
4、删除键值对

可以使用del() 或 pop()方法删除字典中的键值对。

# 使用del 直接删除指定的键值对,如果键不存在会抛出KeyError。
del my_dict["b"]
print(my_dict)  # 输出:{'a': 10,'c': 30}

# 使用 pop(),删除指定的键并返回其对应的值。
# 如果键不存在,可以提供一个默认值来避免抛出KeyError
value = my_dict.pop("c")  # 删除键 “c” ,并返回它的值
print(my_dict)  # 输出:{'a': 10}
print(value)  # 输出:30
5、访问字典中的值

可以通过键来访问字典中的值。如果键不存在,可以使用get()方法避免抛出异常。

# 直接访问
print(my_dict["a"])  # 输出:10

# 使用 get()方法,若键不存在返回None 或 自定义默认值
print(my_dict.get("b"))  # 输出:None
print(my_dict.get("b","Not Found")) # 输出:Not Found
6、遍历字典

可以通过 for 循环遍历字典中的键、值 或键值对

# 遍历键
for key in my_dict:
	print(key)
# 遍历值
for value in my_dict.values()
	print(value)
# 遍历键值对
for key, value in my_dict.items():
	print(key, value)
7、清空字典

可以使用clear()方法来清空字典中的所有键值对

my_dict.clear()
print(my_dict)  # 输出:{}
8、字典的其他常用方法:

keys():返回字典中所有的键

values():返回字典中所有的值

items():返回字典中的所有键值对

print(my_dict.keys()) # 输出:dict_keys(['a','b','c'])
print(my_dict.values())  # 输出: dict_values([1,20,30])
print(my_dict.items())  # 输出:dict_items([('a',1), ('b', 20),('c', 30)])

你能简单解释一下类和对象的区别吗?

对象是类的实例,类是一个蓝图或模板,用于定义对象的属性和行为。对象是根据类创建的实例,拥有类中定义的属性和行为。简单来说,类是抽象的概念,而对象是具体的实例。

你能简单说说如何在python类中定义一个方法,并创建对象调用吗?

1、定义类和方法
class MyClass:
	# 定义构造函数(初始化方法),可以初始化对象的属性
	def __init__(self, name, age):
		self.name = name
		self.age = age
	# 定义一个普通方法
	def greet(self):
		print(f"Hello ,my name is {self.name} and I am {self.age} years old.")
	# 定义一个类的静态方法(没有self参数)
	@staticmethod
	def static_method():
		print("This is a static method and does not need access to instance attributes.")
2、创建对象并调用对象
# 创建一个 MyClass 类的对象
person = MyClass("Alice", 30)

# 调用 greet 方法
person.greet()  # 输出: Hello, my name is Alice and I am 30 years old.

# 调用静态方法
person.static_method()  # 输出: This is a static method and does not need access to instance attributes.

总结

实例方法:在类内部定义的方法,通常需要self参数来访问实例属性。

静态方法:用@staticmethod 装饰器标记,不需要访问实例的任何属性或方法

你能简单解释一下什么是继承?如何在Python中实现继承吗?以及如何调用父类方法?

继承是面向对象编程 即 OOP 中的一个概念,它允许一个类从另一个类“继承”属性和方法。通过继承,可以实现代码的重用,减少重复代码,同时也能扩展或修改父类的行为。

在python中实现继承:
#定义父类
class Animal:
	def __init__(self,name):
		self.name = name
	def speak(self):
		print(f"{self.name} makes a sound")

# 定义子类,继承Animal类
class Dog(Animal):
	def speak(self):
	print(f"{self.name} braks")

# 创建子类对象
dog = Dog("Buddy")
dog.speak()  # 输出: Buddy barks
如何调用父类方法:

在子类中,如果重写了父类的方法,但仍然希望调用父类的方法,可以使用super() 来调用父类的方法,super()会返回父类的一个实例,所以可以通过它来调用父类的方法。

# 在子类中调用父类的方法
class Dog(Animal):
	def speak(self):
		super().speak() # 调用父类的 speak方法
		print(f"{self.name} barks")
dog = Dog("Buddy")
dog.speak()  # 输出: Buddy makes a sound \nBuddy barks

你能解释一下什么是多态吗?以及如何在python中实现多态吗?

多态是指同一个接口或方法在不同类的实现中表现出不同的行为。在python中,通过方法重写和鸭子类型可以实现多态。比如,不同类中定义同名方法,调用时根据对象类型执行相应的方法。

实例如下:我们定义两个类,它们都有一个speck方法:

这里 “animal_sound”函数可以接受任何有speak方法的对象,无论是dog还是cat,这就是多态的一个例子。

class Dog:
	def speak(self):
		return "Woof!"

class Cat:
	def speak(self):
		return "Meow!"

def animal_sound(animal):
	return animal.speak()

dog = Dog()
cat = Cat()

print(animal_sound(dog)) # 输出 Woof!
print(animal_sound(cat)) # 输出 Meow!

python 中,如何处理文件操作,比如读取和写入文件?

使用open 函数打开文件,然后可以用read()方法读取,或用write()方法写入。

记得最后使用close()关闭文件或使用with语句自动处理。这样就完成了基本的文件操作。

open()函数详细介绍

通过内置的open()函数来打开文件,然后进行读取或写入操作:

open(filename, mode)
  • filename 是文件的路径(可以是绝对路径或相对路径)

  • mode 是打开文件的模式,常见的有:

    • r:只读模式(默认),文件必须已经存在,否则抛出FileNotFoundError

    • w:写入模式,如果文件不存在,会创建新文件;如果文件已存在,会清空文件内容。

    • a:追加模式,如果文件不存在,会创建新文件;如果文件已存在,会在文件末尾追加内容。

    • x:独占写入模式,文件必须不存在, 否则会抛出FileExistsError

    • 二进制写入模式:

      • rb:二进制方式读取,文件必须存在,不存在抛出FileNotFoundError
      • wb:二进制写入模式,文件不存在会创建,存在则清空
      • ab:二进制追加模式,文件不存在会创建,存在则在末尾追加
      • xb:二进制独占写入模式,文件必须不存在,否则抛出FileExistsError
使用:
1、打开文件——>进行操作——>手动关闭文件 (不推荐)
# 打开文件进行读取
file = open('example.txt', 'r')  # 打开文件,模式为 'r'(读取)
content = file.read()  # 读取文件内容
print("File content:")
print(content)
# 关闭文件
file.close()
# ---------------------------------------------
# 打开文件进行写入
file = open('example.txt', 'w')  # 打开文件,模式为 'w'(写入),会覆盖原文件内容
file.write("This is new content.")  # 写入新内容
file.close()
# ---------------------------------------------

# 再次打开文件进行追加
file = open('example.txt', 'a')  # 打开文件,模式为 'a'(追加)
file.write("\nAppending this line.")  # 追加内容
file.close()
# ---------------------------------------------
# 再次读取文件以验证内容
file = open('example.txt', 'r')  # 打开文件进行读取
content = file.read()  # 读取文件内容
print("\nUpdated file content:")
print(content)
file.close()  # 最后关闭文件
# ---------------------------------------------

2、使用with(),自动关闭文件,即使发生异常也能确保文件被正确关闭
# 读取文件
with open('example.txt', 'r') as file:
    content = file.read()
    print("File content:")
    print(content)

# 写入文件
with open('example.txt', 'w') as file:
    file.write("This is new content.")

# 追加内容
with open('example.txt', 'a') as file:
    file.write("\nAppending this line.")

# 再次读取文件
with open('example.txt', 'r') as file:
    content = file.read()
    print("\nUpdated file content:")
    print(content)

3、处理文件异常

文件操作可能会因为文件不存在、权限问题等原因抛出异常。可以使用try 和 except 来捕获并处理这些异常。

try:
    with open('nonexistent_file.txt', 'r') as file:
        content = file.read()
except FileNotFoundError:
    print("File not found.")
except Exception as e:
    print(f"An error occurred: {e}")

你能简单说说Django框架的基本结构吗?比如什么是MVT模式?

MVT模式是Django的核心,Model负责数据,View处理业务逻辑,Template则负责展示。这样,开发者就可以更清楚的分离数据、逻辑和界面。

在Django中,视图(View)是如何处理用户请求的?你能简单描述一下流程吗?

在Django中,视图(View)接受HTTP请求,处理业务逻辑,然后返回一个HTTP响应。通常,视图会调用Model获取数据,然后将数据传递给模板(Template)进行渲染,最终将渲染后的HTML返回给用户。这就是基本的流程。

python 中有一个特殊的方法叫__init__,你知道它的作用是什么吗?

__init__方法是一个特殊的构造函数,用于初始化对象。当你创建类的实例时,这个方法会自动调用,可以用来设置对象的初始状态。

python中的魔法方法非常拥有,比如__str__方法。你知道它的作用是什么吗?

__str__方法用于定义对象的字符串表示。当你用print()打印对象时,会调用这个方法,返回一个友好的字符串表示,方便阅读。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2303601.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习之图像回归(二)

前言 这篇文章主要是在图像回归&#xff08;一&#xff09;的基础上对该项目进行的优化。&#xff08;一&#xff09;主要是帮助迅速入门 理清一个深度学习项目的逻辑 这篇文章则主要注重在此基础上对于数据预处理和模型训练进行优化前者会通过涉及PCA主成分分析 特征选择 后…

中文Build a Large Language Model (From Scratch) 免费获取全文

中文pdf下载地址&#xff1a;https://pan.baidu.com/s/1aq2aBcWt9vYagT2-HuxdWA?pwdlshj 提取码&#xff1a;lshj 原文、代码、视频项目地址&#xff1a;https://github.com/rasbt/LLMs-from-scratch 翻译工具&#xff1a;沉浸式翻译&#xff08;https://app.immersivetrans…

【鸿蒙开发】第四十四章 Map Kit(地图服务)

目录​​​​​​​ 1 Map Kit简介 1.1 场景介绍 2 开发准备 开通地图服务 3 创建地图 3.1 显示地图 3.1.1 接口说明 3.1.2 开发步骤 1、地图显示 2、设置地图属性 3、开启3D建筑图层 4、地图前后台切换 5、深色模式 3.2 切换地图类型 3.2.1 场景介绍 3.2.2 接…

EasyExcel 自定义头信息导出

需求&#xff1a;需要在导出 excel时&#xff0c;合并单元格自定义头信息(动态生成)&#xff0c;然后才是字段列表头即导出数据。 EasyExcel - 使用table去写入&#xff1a;https://easyexcel.opensource.alibaba.com/docs/current/quickstart/write#%E4%BD%BF%E7%94%A8table%E…

DeepSeek 提示词:定义、作用、分类与设计原则

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

ubuntu环境编译ffmepg支持nvidia显卡加速

文章目录 1. 安装NVIDIA驱动2. 安装CUDA&NV-CODEC2.1 安装CUDA2.2 安装NV-CODEC 3. 编译ffmpeg3.1 安装依赖3.2 下载源码安装依赖3.3 验证 4. 使用 1. 安装NVIDIA驱动 安装依赖包 sudo apt install -y ubuntu-drivers-common编辑 /etc/modprobe.d/blacklist-nouveau.conf 文…

边缘安全加速(Edge Security Acceleration)

边缘安全加速&#xff08;Edge Security Acceleration&#xff0c;简称ESA&#xff09;是一种通过将安全功能与网络边缘紧密结合来提升安全性和加速网络流量的技术。ESA的目标是将安全措施部署到接近用户或设备的地方&#xff0c;通常是在网络的边缘&#xff0c;而不是将所有流…

SpringCould+vue3项目的后台用户管理的CURD【Taurus教育平台】

文章目录 一.SpringCouldvue3项目的后台用户管理的CURD【Taurus教育平台】 1.1 背景 二.用户列表&#xff08;分页查询&#xff09; 2.1 前端Vue3 &#xff08;Vue3-Element-Admin&#xff09;2.2 后端SpringCould 处理 三. 用户信息删除 3.1 前端Vue3 &#xff08;Vue3-Eleme…

ROS-相机话题-获取图像-颜色目标识别与定位-目标跟随-人脸检测

文章目录 相机话题获取图像颜色目标识别与定位目标跟随人脸检测 相机话题 启动仿真 roslaunch wpr_simulation wpb_stage_robocup.launch rostopic hz /kinect2/qhd/image_color_rect/camera/image_raw&#xff1a;原始的、未经处理的图像数据。 /camera/image_rect&#xff…

调用click.getchar()时Windows PyCharm无法模拟键盘输入

文章目录 问题描述解决方案参考文献 问题描述 调用 click.getchar() 时&#xff0c;Windows PyCharm 无法模拟键盘输入 解决方案 Run → Edit Configurations… → Modify options → Emulate terminal in output console 参考文献 Terminal emulator | PyCharm Documentati…

易基因: ChIP-seq+DRIP-seq揭示AMPK通过调控H3K4me3沉积和R-loop形成以维持基因组稳定性和生殖细胞完整性|NAR

原文&#xff1a;ChIP-seqDRIP-seq揭示AMPK通过调控H3K4me3沉积和R-loop形成以维持基因组稳定性和生殖细胞完整性&#xff5c;NAR 大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 在饥饿等能量胁迫条件下&#xff0c;生物体会通过调整…

数据中心储能蓄电池状态监测管理系统 组成架构介绍

安科瑞刘鸿鹏 摘要 随着数据中心对供电可靠性要求的提高&#xff0c;蓄电池储能系统成为关键的后备电源。本文探讨了蓄电池监测系统在数据中心储能系统中的重要性&#xff0c;分析了ABAT系列蓄电池在线监测系统的功能、技术特点及其应用优势。通过蓄电池监测系统的实施&#…

01数据准备 抓取图片 通过爬虫方式获取bing的关键词搜索图片

为了获取训练所需的图片,我们最常用的手段就是自己去写一个爬虫去获取相关图片。本文将重点围绕如何采用爬虫的方式获取训练所需的图片素材进行讲解,为了大家能够够直观的掌握相关技术,参考本文的相关过程和代码获取自己的数据图片素材,笔者将详细介绍实现过程。 1、确定图…

【UCB CS 61B SP24】Lecture 5 - Lists 3: DLLists and Arrays学习笔记

本文内容为构建双向循环链表、使用 Java 的泛型将其优化为通用类型的链表以及数组的基本语法介绍。 1. 双向链表 回顾上一节课写的代码&#xff0c;当执行 addLast() 与 getLast() 方法时需要遍历链表&#xff0c;效率不高&#xff0c;因此可以添加一个指向链表末尾的索引&am…

Git 工作流程

1、Git 工作流程 http://www.ruanyifeng.com/blog/2015/12/git-workflow.html git push -f origin HEAD^:master 删除服务器上最近的一次提交git push -f origin HEAD^:master 2、Git分支管理 动画形式演示分支效果&#xff1a; http://onlywei.github.io/explain-git-with-…

DeepSeek接入Siri(已升级支持苹果手表)完整版硅基流动DeepSeek-R1部署

DeepSeek接入Siri&#xff08;已升级支持苹果手表&#xff09;完整版硅基流动DeepSeek-R1部署 **DeepSeek** 是一款专注于深度学习和人工智能的工具或平台&#xff0c;通常与人工智能、机器学习、自动化分析等领域有关。它的主要功能可能包括&#xff1a;深度学习模型搜索&…

个人博客5年回顾

https://huangtao01.github.io/ 五年前&#xff0c;看程序羊的b站视频做的blog&#xff0c;受限于网络&#xff0c;只能单向学习&#xff0c;没有人指导与监督&#xff0c;从来没有想过&#xff0c;有没有什么问题&#xff1f; 一、为什么要做个人博客&#xff1f; 二、我是怎么…

nacos编写瀚高数据库插件

1、下载nacos源码 git clone gitgithub.com:alibaba/nacos.git 2、引入瀚高驱动 <dependency><groupId>com.highgo</groupId><artifactId>jdbc</artifactId><version>${highgo.version}</version></dependency> 3、DataSource…

bboss v7.3.5来袭!新增异地灾备机制和Kerberos认证机制,助力企业数据安全

ETL & 流批一体化框架 bboss v7.3.5 发布&#xff0c;多源输出插件增加为特定输出插件设置记录过滤功能&#xff1b;Elasticsearch 客户端新增异地双中心灾备机制&#xff0c;提升框架高可用性&#xff1b;Elasticsearch client 和 http 微服务框架增加对 Kerberos 认证支持…

《Python实战进阶》专栏 No2: Flask 中间件与请求钩子的应用

专栏简介 《Python实战进阶》专栏共68集&#xff0c;分为 模块1&#xff1a;Web开发与API设计&#xff08;共10集&#xff09;&#xff1b;模块2&#xff1a;数据处理与分析&#xff08;共10集&#xff09;&#xff1b;模块3&#xff1a;自动化与脚本开发&#xff08;共8集&am…