一 回调函数
回调函数就是一个通过函数指针调用的函数,如果你把函数的指针(地址)作为一个参数传递给另一个参数,当这个指针被用来调用其所指向的函数时,这就是我们说的回调函数.
简单来说:回调函数就是把函数当成一个参数传递到函数中.
需求:现在酒店提供免费叫醒服务,叫醒的方式有多种,你可以自己选择,比如夺命电话连环call, 或者是早起冷水迎头泼,随你自己喜欢,只要你提前预约,则酒店工作人员将在你指定的时间用你喜欢的方式叫醒你.
def wake_call(time):
#第一种叫醒服务
print(time,"使用夺命电话连环call叫醒主人")
def wake_water(time):
#第二种叫醒服务
print(time,"使用早起泼冷水的方式叫醒主人")
def call_wake(time, func_name):
# 这个很重要,这个就是酒店服务业务的系统业务
#这是实现回调函数的核心
# time :预约时间
# func_time:回调函数名
# return :调用的函数的结果
return func_name(time)
#调用函数
#wake_call 被调用的函数就是回调函数
call_wake("凌晨7点", wake_call)
拓展: 编程分为两大类:系统编程和应用编程,所谓的系统编程简单来说就是编写库,而应用编程就是利用写好的各种库来编写具体的某种功能的程序,也就是应用. 系统程序员会在自己写的库中留下API(应用编程接口),以供应用程序员使用.
当程序跑起来,一般情况下,应用程序会时常通过API调用库中所预备好的函数,但是有些库函数却要求应用先给它传递一个函数,好在合适的时候调用,以完成目标,这个被传入的后来又被调用的函数成为回调函数
二 返回函数
函数作为返回值
在python中除了可以接受函数作为参数外,还可以把函数作为结果值返回.
需求:实现一个可变参数的求和.通常是这么定义的:
def calc_sum(*args):
sum = 0
for i in args:
sum += i
return sum
现在需求有变,现在我不需要立即求和,而是在后面的代码中,根据需要再进行计算,这时候,我们可以不返回求和的结果,而是返回求和的函数.
def lazy_sum(*args):
def calc_sum():
sum = 0
for i in args:
sum += i
return sum
return calc_sum
当我们调用lazy_sum()时,返回的并不是求和的结果而是求和的函数
>>> f = lazy_sum(1, 2, 3, 4)
>>> f
<function lazy_sum.<locals>.calc_sum at 0x101b61598>
这时候调用f时,才真正计算求和的结果
>>> f()
10