Skip to main content

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.回调函数的应用场景

  1. 异步编程(比如网络请求、文件读写):

当一个操作需要等待一段时间完成时,可以用回调函数在操作完成后自动触发相应的处理逻辑。

  1. 事件驱动编程(GUI编程):

在图形界面应用中,回调函数常用于处理按钮点击、鼠标移动等事件。

  1. 函数式编程:

回调函数广泛应用于 map()filter()sorted()等高阶函数中。

  1. 自定义行为:

在一个通用函数中使用回调,可以根据不同需求执行不同的逻辑,增加代码的灵活性和可复用性。

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高阶函数中的回调(sortedfilter):

# 按字符串长度排序(使用回调函数指定排序规则)
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事件处理、数据处理(如排序、过滤)等。

回调函数就像是把”下一步该干什么“的决定权交给另一个函数,等到事情进行到一定阶段时,再”回头执行“。