### 老生常谈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币余额
- 我的收藏
- 我的下载
- 下载帮助