### 老生常谈Python之装饰器、迭代器和生成器 #### 一、装饰器 装饰器是Python中的一个重要特性,它提供了一种在不改变原函数代码的情况下为函数添加新功能的方法。这对于增强代码的灵活性和可维护性至关重要。 ##### 为什么使用装饰器? 1. **增加功能**:在不修改原有代码的基础上增加额外的功能,例如日志记录、性能监控等。 2. **简化代码**:避免重复编写相似功能的代码,提高代码复用率。 3. **保持清晰**:通过装饰器将功能逻辑分离出来,使得主程序代码更加清晰、易于阅读。 4. **扩展性**:便于后续添加或更改功能而无需改动原函数代码。 ##### 什么是装饰器? 装饰器本质上是一个接收函数作为参数的函数,并返回一个新的函数。它可以用来修改被装饰函数的行为,而无需修改函数本身的代码。 ##### 示例:无参装饰器 假设我们有一个函数`foo()`,功能很简单,就是打印一条消息前先等待2秒: ```python import time def foo(): """打印""" time.sleep(2) print("Hello boy!") foo() ``` 现在我们希望为`foo()`函数添加计时功能,但又不想修改原有的代码结构,可以通过装饰器来实现: ```python import time def timer(func): def wrapper(): """计时功能""" time_start = time.time() func() time_end = time.time() print("Runtime is %f" % (time_end - time_start)) return wrapper @timer # 等价于 foo = timer(foo) def foo(): """打印""" time.sleep(2) print("Hello boy!") foo() ``` 这里的关键点在于,`@timer`语法糖使得`foo()`实际上变成了`timer(foo)`的返回值,即`wrapper`函数。因此,当我们调用`foo()`时,实际上是在调用`wrapper()`。 ##### 有参装饰器 在实际应用中,有时需要根据不同的需求传递参数给装饰器。例如,我们可以创建一个能够接受参数的装饰器来实现不同级别的日志记录: ```python def log(level): def decorator(func): def wrapper(*args, **kwargs): print(f"[{level}] Function '{func.__name__}' started.") result = func(*args, **kwargs) print(f"[{level}] Function '{func.__name__}' ended.") return result return wrapper return decorator @log("INFO") def add(a, b): return a + b print(add(3, 4)) ``` 这里`@log("INFO")`会先执行`log("INFO")`得到`decorator`,然后执行`decorator(add)`得到`wrapper`,最终`add`函数被替换成了`wrapper`。 #### 二、迭代器与生成器 除了装饰器之外,本文还提到了迭代器和生成器这两个概念。 ##### 迭代器 迭代器是一个可以记住遍历的位置的对象。Python 中的迭代器有两个基本方法:`iter()` 和 `next()`。 1. **iter()**:返回一个迭代器对象。 2. **next()**:返回下一个迭代的数据。 例如,我们可以创建一个简单的迭代器来遍历列表: ```python my_list = [1, 2, 3] iterator = iter(my_list) print(next(iterator)) # 输出 1 print(next(iterator)) # 输出 2 print(next(iterator)) # 输出 3 ``` ##### 生成器 生成器是一种特殊的迭代器,它使用关键字`yield`来返回一系列的值。生成器不仅可以节省内存空间,还可以实现惰性求值。 例如,下面的代码定义了一个生成器函数,用于生成斐波那契数列: ```python def fibonacci(n): a, b = 0, 1 while a < n: yield a a, b = b, a + b for num in fibonacci(100): print(num, end=' ') ``` 总结而言,装饰器、迭代器和生成器是Python中非常重要的高级特性,它们各自解决了不同的问题,但在设计上都有着异曲同工之妙。理解和掌握这些概念对于编写高质量、高效率的Python代码至关重要。


















剩余6页未读,继续阅读


- 粉丝: 1
- 资源: 936
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- daily-interview-master整理的面经,内容包括机器学习,CV,NLP
- Oracle 11g安装步骤详谈.docx
- 第十四届蓝桥杯单片机组国二代码库.zip
- Java学习路径:从基础到高级的企业级开发指南
- 博客管理系统的前台代码
- 1998-2022年各地级市第二产业占GDP比重数据/地级市第二产业占比数据(全市).xlsx
- 管家婆辉煌食品版TOP13.3
- OpenCV for Unity 2.3.4
- 关于DeepSeek的全网相关资源整理及实用指南
- ollama部署包+deepseek部署指南+deepseek技术文档
- 基于STM32F103系列芯片的OTA远程升级方案:WiFi连接,稳定可靠的BIN文件升级流程,基于STM32F103系列芯片的OTA远程升级方案:WiFi连接,稳定可靠的BIN文件升级流程,stm3
- 管家婆辉煌食品版TOP13.32
- 项目到期后自动关闭11
- 基于PLC的85#三菱组态王药片装瓶自动控制系统的设计与实现,基于PLC与三菱组态王的自动控制系统在药片装瓶过程中的应用与优化,85#三菱组态王基于PLC的药片装瓶自动控制系统 ,三菱组态王
- 基于MATLAB的图像中值滤波代码
- 沈阳日立笔试题(4).zip


