九、异步编程与 async/await
在处理 I/O 密集型任务时,异步编程可以显著提高程序的效率。Python 3.5 引入了async和await关键字,使得异步编程变得更加简洁和直观。
以下是一个简单的异步函数示例:
import asyncio
async def async_task():
print("Async task started")
await asyncio.sleep(2)
print("Async task completed")
然后,我们可以使用事件循环来运行异步任务:
loop = asyncio.get_event_loop()
loop.run_until_complete(async_task())
异步编程还可以结合多个异步任务并发执行,例如:
async def async_task_1():
print("Task 1 started")
await asyncio.sleep(1)
print("Task 1 completed")
async def async_task_2():
print("Task 2 started")
await asyncio.sleep(3)
print("Task 2 completed")
async def main():
task1 = async_task_1()
task2 = async_task_2()
await asyncio.gather(task1, task2)
十、内存视图(memoryview)
内存视图允许在不复制内存的情况下操作数组数据。这对于处理大型数组或从缓冲区读取数据非常有用。
例如,使用内存视图操作字节数组:
data = bytearray(b'\x00\x01\x02\x03\x04')
mv = memoryview(data)
print(mv[1])
mv[1] = 0xff
print(data)
十一、运算符重载
在 Python 中,我们可以通过重载运算符来定义自定义类的特定运算行为。例如,我们可以为向量类重载加法运算符:
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
v1 = Vector(1, 2)
v2 = Vector(3, 4)
result = v1 + v2
十二、使用 weakref 模块进行弱引用
弱引用是一种不增加对象引用计数的引用方式。这在避免循环引用导致的内存泄漏方面非常有用。
例如,创建一个弱引用字典:
import weakref
class MyObject:
def __init__(self, name):
self.name = name
obj = MyObject("Example")
weak_dict = weakref.WeakValueDictionary()
weak_dict['obj'] = obj
当obj的强引用被移除后,weak_dict中的对应项也会自动删除。
十三、自定义异常类
除了使用 Python 内置的异常类,我们还可以自定义异常类来更好地适应特定的程序逻辑。
例如:
class CustomError(Exception):
def __init__(self, message):
self.message = message
super().__init__(message)
try:
raise CustomError("This is a custom error")
except CustomError as e:
print(e.message)
十四、利用 functools 模块进行函数工具操作
functools模块提供了许多用于函数操作的工具,如lru_cache(最近最少使用缓存)。
例如,使用lru_cache缓存函数的结果:
import functools
@functools.lru_cache(maxsize=128)
def expensive_function(x):
print(f"Calculating for {x}")
return x * x
当再次调用expensive_function时,如果参数相同,将直接返回缓存的结果。
十五、利用 inspect 模块进行代码检查
inspect模块可以用于检查函数、类、模块等的内部结构。
例如,获取函数的参数信息:
import inspect
def example_function(a, b, c=0):
pass
sig = inspect.signature(example_function)
for param in sig.parameters.values():
print(param.name, param.default)