一 回调函数

回调函数:就是一个通过函数指针调用的函数,如果你把函数的指针(地址)作为一个参数传递给另一个参数,当这个指针被用来调用其所指向的函数时,这就是我们说的回调函数.

说人话就是:回调函数就是把函数当成一个参数传递到函数中.

def  wake_call(time):                                                       #回调函数
    print(time,"使用夺命电话连环call叫醒主人")

def wake_water(time):                                                     #回调函数
    print(time,"使用早起泼冷水的方式叫醒主人")

def call_wake(time, func_name):
    # 这个很重要,这个就是酒店服务业务的系统业务
    #这是实现回调函数的核心
    # time :预约时间
    # func_name:回调函数名
    # return :调用的函数的结果
    return func_name(time)

#调用函数
被调用的函数就是回调函数
call_wake("凌晨7点", wake_call)

二 返回函数

定义:把函数作为返回值

如:

def lazy_sum(*args):
    def calc_sum():
        sum = 0
        for i in args:
            sum += i
        return sum
    return calc_sum

调用:返回的并不是求和的结果而是求和的函数

f = lazy_sum(1, 2, 3, 4)

print(f)

>>><function lazy_sum.<locals>.calc_sum at 0x101b61598>

这时候调用f时,才真正计算求和的结果 :

print(f())

>>>10

三 闭包

闭包:在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用,这样就构成了一个闭包

PS:一般情况下,如果一个函数结束,函数内部所有的东西都会被释放掉,还给内存,局部变量也会消失,但是闭包是一种特殊的情况,如果外函数在结束的时候发现有自己的临时变量将来还会在内部函数中用到,就把这个临时变量绑定给了内函数,然后再自己结束。执行结束的时候才会真正释放

#外函数, a与b都是临时变量
def outer(a):
    b = 10
    #内函数
    def inner():
        #在内函数中用到了外函数的临时变量
        print(a+b)
    #外函数的返回值是内函数的引用
    return inner
# 调用函数传入参数5
f = outer(5)
f()
#结果
15

 

四 递归函数

递归函数:在函数的内部,可以调用其他的函数,如果一个函数在内部调用自身本身,这个函数就是递归函数.

递归调用:一个函数调用自身,成为递归函数

 

方法:

1.写出临界条件

2.找这一次和上一次的关系

3.假设当前函数已经能用,调用自身计算上一次的结果,再求出本次的结果

# 关系: n!= (n-1)!xn
def fact(n):
   #临界条件
   if n==1:
      return 1
   #返回本次的调用结果
   return n*fact(n-1)

 

PS:使用递归函数需要注意防止栈溢出(大概不超过993次递归),在计算机中函数是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,就会增加一层栈帧,每当函数返回,栈就会减一层栈帧,栈的大小是有限制的,所以当调用的次数过多的时候,会导致栈溢出