Repository navigation
Expand file tree
/
Copy path12_decorators_and_generators.py
More file actions
122 lines (98 loc) · 4.01 KB
/
Copy path12_decorators_and_generators.py
File metadata and controls
122 lines (98 loc) · 4.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# -*- coding: utf-8 -*-
# --- 第12章:装饰器与生成器 ---
# 这一章将介绍 Python 中两个非常强大和高级的特性:装饰器和生成器。
# 它们可以帮助你编写更优雅、更高效、更具可读性的代码。
# --- 1. 装饰器 (Decorators) ---
# 装饰器本质上是一个函数,它接受一个函数作为参数,并返回一个新的函数。
# 它的作用是在不修改原函数代码的情况下,为原函数添加额外的功能。
# 装饰器在日志、性能测试、权限校验、缓存等方面非常有用。
print("--- 装饰器示例 ---")
# 示例 1: 一个简单的计时装饰器
import time
def timer(func):
"""这是一个计时装饰器,用于测量函数执行时间。"""
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"函数 {func.__name__} 执行耗时: {end_time - start_time:.4f} 秒")
return result
return wrapper
@timer # 使用 @ 语法糖应用装饰器
def long_running_function():
"""一个模拟耗时操作的函数。"""
print("开始执行耗时操作...")
time.sleep(2) # 暂停2秒
print("耗时操作完成。")
@timer
def add(a, b):
"""一个简单的加法函数。"""
time.sleep(0.5)
return a + b
long_running_function()
sum_result = add(10, 20)
print(f"加法结果: {sum_result}")
# 示例 2: 一个日志装饰器
def log_calls(func):
"""这是一个日志装饰器,记录函数被调用的信息。"""
def wrapper(*args, **kwargs):
print(f"正在调用函数: {func.__name__},参数: {args}, {kwargs}")
result = func(*args, **kwargs)
print(f"函数 {func.__name__} 调用结束,返回: {result}")
return result
return wrapper
@log_calls
def multiply(x, y):
return x * y
product = multiply(4, 5)
print(f"乘法结果: {product}")
# --- 2. 生成器 (Generators) ---
# 生成器是一种特殊的迭代器,它允许你按需生成序列中的元素,而不是一次性生成所有元素并存储在内存中。
# 这对于处理大量数据或无限序列非常有用。
# 生成器函数使用 yield 关键字而不是 return。
print("\n--- 生成器示例 ---")
# 示例 1: 一个简单的生成器函数
def count_up_to(max_num):
"""一个生成器函数,从0数到 max_num。"""
n = 0
while n <= max_num:
yield n # 每次调用 next() 时,函数会从这里暂停并返回 n,下次从这里继续执行
n += 1
# 创建一个生成器对象
counter = count_up_to(5)
print("使用 next() 逐个获取生成器元素:")
print(next(counter))
print(next(counter))
print(next(counter))
print("使用 for 循环遍历生成器:")
for num in count_up_to(3):
print(num)
# 示例 2: 生成斐波那契数列
def fibonacci_sequence(n):
"""生成前 n 个斐波那契数。"""
a, b = 0, 1
count = 0
while count < n:
yield a
a, b = b, a + b
count += 1
print("生成斐波那契数列:")
for fib_num in fibonacci_sequence(8):
print(fib_num)
# 示例 3: 生成器表达式 (Generator Expressions)
# 类似于列表推导式,但使用圆括号 () 而不是方括号 [],它返回一个生成器对象。
gen_exp = (i**2 for i in range(5))
print("\n生成器表达式:", gen_exp) # 打印的是生成器对象本身
print("遍历生成器表达式:")
for val in gen_exp:
print(val)
# 生成器表达式的优点是内存效率高,因为它不会一次性生成所有结果。
# 例如,sum(i for i in range(1000000)) 会比 sum([i for i in range(1000000)]) 更节省内存。
# --- 章节总结 ---
# 1. 装饰器: 在不修改原函数代码的情况下,为函数添加额外功能。
# - 使用 @ 语法糖应用。
# - 接受函数作为参数,返回新函数。
# 2. 生成器: 一种特殊的迭代器,按需生成元素,节省内存。
# - 使用 yield 关键字。
# - 可以通过 next() 或 for 循环遍历。
# - 生成器表达式是创建简单生成器的简洁方式。