导入
高阶函数与包装器函数
学习如何将函数视为数据,通过将其作为参数传递并从其他函数中返回,创建灵活且可重用的包装器。
1def add(a, b): 2 return a + b 3 4def subtract(a, b): 5 return a - b 6 7def multiply(a, b): 8 return a * b 9 10# 将函数存储在字典中 11operations = { 12 "plus": add, 13 "minus": subtract, 14 "times": multiply 15} 16 17selected_op = "minus" 18 19# 获取函数对象并立即调用 20result = operations[selected_op](10, 4) 21 22print(f"Operation: {selected_op}, Result: {result}")
1def apply_to_list(data, strategy_func): 2 """对列表中的每个元素应用策略函数。""" 3 results = [] 4 for item in data: 5 transformed = strategy_func(item) 6 results.append(transformed) 7 return results 8 9def square(x): 10 return x * x 11 12def stringify(x): 13 return f"Value: {x}" 14 15numbers = [1, 2, 3, 4] 16 17# 将 'square' 函数作为参数传递 18squared_nums = apply_to_list(numbers, square) 19 20# 将 'stringify' 函数作为参数传递 21string_nums = apply_to_list(numbers, stringify) 22 23print(f"Squared: {squared_nums}") 24print(f"Strings: {string_nums}")
1def power_factory(exponent): 2 """返回一个新函数,将数字提升到指定的指数。""" 3 4 def inner_power(base): 5 # 'exponent' 从外部作用域捕获 6 return base ** exponent 7 8 return inner_power 9 10# 创建一个专门用于平方的函数 11square_it = power_factory(2) 12 13# 创建一个专门用于立方的函数 14cube_it = power_factory(3) 15 16print(f"5 squared is: {square_it(5)}") 17print(f"5 cubed is: {cube_it(5)}")
1def logger_wrapper(target_func): 2 """包装一个函数,在执行前添加日志记录。""" 3 4 def inner_wrapper(x, y): 5 print(f"[LOG] 调用函数 '{target_func.__name__}',输入为 {x}, {y}") 6 # 调用原始函数 7 result = target_func(x, y) 8 print(f"[LOG] 执行完成。结果: {result}") 9 return result 10 11 return inner_wrapper 12 13def add(a, b): 14 return a + b 15 16# 手动包装 'add' 函数 17add_with_logging = logger_wrapper(add) 18 19# 调用包装后的版本 20final_sum = add_with_logging(5, 7)
1def logger_wrapper(target_func): 2 def inner_wrapper(x, y): 3 return target_func(x, y) 4 return inner_wrapper 5 6def multiply(a, b): 7 """将两个数字相乘。""" 8 return a * b 9 10print(f"原始名称: {multiply.__name__}") 11 12# 包装函数 13multiply = logger_wrapper(multiply) 14 15print(f"包装后名称: {multiply.__name__}") 16print(f"包装后文档字符串: {multiply.__doc__}")