目录

  • 一、递归函数
  • 1.1什么是递归函数
  • 二、高阶函数
  • 三、匿名函数
  • 四、闭包
  • 作业练习


一、递归函数

1.1什么是递归函数

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

1、求阶乘
>>> def get_factorial(n):                              # 定义阶乘函数
...     if n == 1:                                     # 退出递归的分支
...         return 1
...     return n * get_factorial(n-1)   # 递归调用
...                                                    # 阶乘函数定义结束
>>> get_factorial(3)                                   # 求3的阶乘
6
>>> get_factorial(10)                                  # 求10的阶乘
3628800

• 递归是解决问题的一种方式,它的整体思想,是将一个大问题分解为一个个的小问题,直到问题无法分解时,在去解决问题
• 递归式函数有2个条件

  • 基线条件 问题可以被分解为最小问题,当满足基线条件时,递归就不执行了
  • 递归条件 可以将问题继续分解的条件

二、高阶函数

接收函数作为参数,或者将函数作为返回值返回的函数就是高阶函数
示例

def fun2(i):
    if i % 2 == 0:
        return True


def fun(fn):  # fn是函数的参数(形参) 形参等于实参  fn = fun2  a
    list1 = []
    for i in range(101):
        if fn(i):  # fn(i) = fun2(i)
            list1.append(i)
    return list1


print(fun(fun2))  # 1


def fun3(a, b):  # 这是位置传参  a = 1 , b = 2
    pass


fun3(1, 2)

三、匿名函数

1.防止重名
2. 不用再去定义函数,使用方便
3. 可以作为一个传参的工具

lambda 函数就是匿名函数
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
语法: lambda 参数:表达式
print((lambda a, b: a + b)(1, 2)) # 同下

# def fun(a, b):
#     print(a + b)
#
#
# fun(1, 2)
# print((lambda a : a % 2 == 0)(list1))
# # filter() 有两个参数,第一个参数(函数)是过滤规则,第二个是过滤的数据
# s = lambda a: a % 2 == 0
# print(list(filter(s, list1)))

四、闭包

将函数作为返回值也是高阶函数我们也称为闭包
闭包的好处

  • 通过闭包可以创建一些只有当前函数能访问的变量
  • 可以将一些私有数据藏到闭包中

行成闭包的条件

  • 函数嵌套
  • 将内部函数作为返回值返回
  • 内部函数必须要使用到外部函数的变量
函数嵌套
# 将内部函数对象作为返回值返回
# 内部函数必须要使用到外部函数的变量或参数

# 保证被内部使用的外部变量不被销毁
# 定义一个外部函数
# def fun_out(num1):
#
#     # 定义一个内部函数
#     def fun_inner(num2):
#         res = num1 + num2
#         # print(res)
#         return res
#
#     return fun_inner
#
#
# # 函数的调用等于函数的返回值
# f = fun_out(1)  # fun_out(1)() = fun_inner() = f()
# # 内部函数的调用  fun_inner()
# print(f(2))
# print(f(3))

# 修改外部函数的变量
def fun_out(num1):

    # 定义一个内部函数
    def fun_inner(num2):
        # global num1
        nonlocal num1  # 告诉解释器,这里使用的不是本地的num1, 是外部变量的num1
        num1 = 10
        res = num1 + num2
        # print(res)
        return res

    print(num1)
    fun_inner(1)
    print(num1)
    return fun_inner


# 函数的调用等于函数的返回值
f = fun_out(1)  # fun_out(1)() = fun_inner() = f()
# 内部函数的调用  fun_inner()
# print(f(2))
# print(f(3))


# b = 1
#
# def fun(a):  #  a = b
#     a = 0
#     print(a)
#
#
# fun(b)
# print(b)

作业练习

  1. 猴子吃桃问题(递归):
    猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了,求第一天共摘了多少桃子?
def func(n):
    if n==10:
        return 1
    return (func(n+1)+1)*2


print(func(1))

结果

1534