05-回调函数
1.什么是回调函数?
回调函数(Callback Function),简单来说,就是把 一个函数当作参数传给另一个函数,在合适的时候再“回头”调用它。这就像是 委托别人完成任务,但保留决定“何时”执行这个任务的权力。
2.比喻
想象你在参观点餐,服务员问你:”吃完饭后需要甜点吗?“
你说:”需要,吃完后给我上冰激凌。“
在这个场景中:
- 你点的冰激凌 = 回调函数(它代表一个操作)
- 服务员 = 另一个函数,负责管理整个过程(比如处理点餐、上菜等),但吃完饭后再”回头“调用你的甜点需求(回调函数)。
3.回调函数的基本形式
在 Python 中,函数本身就是 一等公民,可以作为参数传递。回调函数就是利用这一特性,把函数作为参数传给另一个函数。
def process_data(data, callback):
print("正在处理数据...")
processed = data.upper()
callback(processed) # 处理完数据后调用回调函数
def print_result(result):
print(f"处理结果:{result}")
# 使用回调函数
process_data("hello world", print_result)
输出:
正在处理数据...
处理结果:HELLO WORLD
4.回调函数的应用场景
- 异步编程(比如网络请求、文件读写):
当一个操作需要等待一段时间完成时,可以用回调函数在操作完成后自动触发相应的处理逻辑。
- 事件驱动编程(GUI编程):
在图形界面应用中,回调函数常用于处理按钮点击、鼠标移动等事件。
- 函数式编程:
回调函数广泛应用于 map()
,filter()
,sorted()
等高阶函数中。
- 自定义行为:
在一个通用函数中使用回调,可以根据不同需求执行不同的逻辑,增加代码的灵活性和可复用性。
5.回调函数的实际案例
5.1异步任务模拟(比如下载完成后通知用户):
import time
def download_file(filename, callback):
print(f"开始下载 {filename}...")
time.sleep(2) # 模拟下载过程
print(f"{filename} 下载完成!")
callback(filename)
def notify_user(file):
print(f"通知:文件 '{file}' 已成功下载!")
# 使用回调函数
download_file("example.zip", notify_user)
输出:
开始下载 example.zip...
example.zip 下载完成!
通知:文件 'example.zip' 已成功下载!
5.2事件驱动(按钮点击的回调)
def on_button_click():
print("按钮被点击了!")
def simulate_button_click(callback):
print("用户点击了按钮...")
callback()
# 模拟按钮点击事件
simulate_button_click(on_button_click) # 传入目标函数的名称
输出:
用户点击了按钮...
按钮被点击了!
5.3高阶函数中的回调(sorted
和 filter
):
# 按字符串长度排序(使用回调函数指定排序规则)
words = ["apple", "banana", "cherry", "date"]
# key 参数接受一个回调函数
sorted_words = sorted(words, key=lambda word: len(word))
print(sorted_words) # 输出: ['date', 'apple', 'banana', 'cherry']
# 过滤偶数
numbers = [1, 2, 3, 4, 5, 6]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers) # 输出: [2, 4, 6]
6.总结
- 回调函数 = 把函数当作参数传递,等到适当时机再执行。
- 它让代码更加灵活、可重用,尤其适合处理异步任务、事件驱动和函数式编程。
- 常见应用场景包括异步编程(网络请求)、GUI事件处理、数据处理(如排序、过滤)等。
回调函数就像是把”下一步该干什么“的决定权交给另一个函数,等到事情进行到一定阶段时,再”回头执行“。