python基础学习14_函数的进阶 (递归函数、lambda函数、高阶函数的使用)

主要内容:

一、递归函数

1、什么是递归函数:

在函数的定义中,函数内部的语句调用函数本身。

2、应用场景:

遍历一个文件夹下的所有文件;快排等一些算法

3、特点:

  1. 自己调用自己
  2. 必须有一个明确的结束条件;(否则陷入死循环,报错)
  3. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
  4. 相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入)。
  5. 递归效率不高,递归层次过多会导致栈溢出。
    (在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

4、执行过程:

在这里插入图片描述

5、实例

递归累加

"""
实例1:处理5以内的累加 5+4+3+2+1 = 15
    15 = 5 + (4以内数字的累加和)
    (4以内数字的累加和) = 4 + (3以内数字的累加和)
    (3以内数字的累加和) = 3 + (2以内数字的累加和)
    (2以内数字的累加和) = 2 + (1以内数字的累加和)
    (1以内数字的累加和) = 1  ---出口(结束条件)
"""

def sum_num(n):
    # 如果为1,直接返回1 -- 出口
    if n == 1:
        return 1
    # 先不断向下求累加和,不断调用sun_num(n-1),直到n=1,
    # 再不断向上返回累加结果,1向sum(2-1)返回结果,得到 2+1 =3 ,继续向sum(3-1)返回结果,以此类推。
    return n + sum_num(n - 1)


a = sum_num(5)
print(a)  # 15

递归累乘

"""
实例2:计算n的阶乘n! = 1 * 2 * 3 * ... * n
    n! = n * (n-1) * (n-2) *...* 1
"""
def mul_num(n):
    if n == 1:
        return 1
    result = n * mul_num(n - 1)
    return result


a = mul_num(4)  # 4*3*2*1
print(a)  # 24

二、lambda函数

1、定义:

匿名函数lambda:是指一类无需定义标识符(函数名)的函数或子程序。

2、语法:

lambda 参数列表 : 表达式

注意:只有一个表达式

3、特点:

  1. 只有一个返回值
  2. 只有一句表达式
  3. 能接收任何数量的参数,函数的参数在lambda表达式中完全适用

4、参数形式:

  • 无参:lambda: 表达式
result = (lambda: 100)
print(result) # <function <lambda> at 0x0000025FD86D9318>
print(result())  # 100

注意: 直接打印lambda表达式,输出的是此lambda的内存地址

  • 一个参数:lambda a: 表达式
result = (lambda a: a)
print(result(200))  # 200
  • 两个参数:lambda a,b: 表达式
result = (lambda a, b: a + b)
print(result(100, 200))  # 300
  • 缺省参数:lambda a,b,c=value:表达式
result = (lambda a, b, c=5: a + b + c)
print(result(100, 200))  # 305

result = (lambda a, b, c=5: a + b + c)
print(result(100, 200, 10))  # 310
  • 可变参数*args: lambda *args:表达式
result = (lambda *args: args)
print(result('ni', '50'))  # ('ni', '50')
print(result())  # ()
  • 可变参数**kwargs: lambda **kwargs:表达式
result = (lambda **kwargs: kwargs)
print(result(name='lily'))  # {'name': 'lily'}
print(result())  # {}

5、lambda的应用:

5.1、与三目运算一起使用

result = (lambda a, b: a if a > b else b)
print(result(100, 200))  # 200

5.2、 列表数据按字典key的值排序

# 当列表数据中嵌套了字典,如何根据字典中的数据排序?
students = [{'name': 'TOM', 'age': 20}, {'name': 'ROSE', 'age': 19}, {'name': 'Jack', 'age': 22}]

# 根据年龄排序
students.sort(key=lambda x: x['age'])
print(students)  # [{'name': 'ROSE', 'age': 19}, {'name': 'TOM', 'age': 20}, {'name': 'Jack', 'age': 22}]

# 根据年龄降序排序
students.sort(key=lambda x: x['age'], reverse=True)
print(students)  # [{'name': 'Jack', 'age': 22}, {'name': 'TOM', 'age': 20}, {'name': 'ROSE', 'age': 19}]

三、高阶函数

1、什么是高阶函数:

一个函数作为参数传给另外一个函数

2、优点:

减少了代码的重复,开发速度较快

3、python内置高阶函数

  • map(func, lst)

    func作用到list中的每个元素,并返回新的列表数据(用list()转换)

    list1 = [1, 2, 3, 4, 5, 6]
    
    
    def func(a):
        return a ** 2
    
    
    result = map(func, list1)
    print(result)  # <map object at 0x000001AFBB9EA708> 返回一个map对象
    print(list(result))  # [1, 4, 9, 16, 25, 36]
    
  • reduce(func(x,y),list)

    func必须有两个参数,每次func计算的结果继续和序列的下⼀个元素做累
    积计算。

    import functools
    
    
    def func(x, y):
        return x * y
    
    
    list1 = [1, 2, 3, 4, 5, 6]
    # 导入functools模块中的reduce函数
    result = functools.reduce(func, list1)
    print(result)  # 720
    
  • filter(func,list)

    过滤list中不符合条件的元素,并返回filter对象,如果要将返回的对象转换成list,用list()

    def func(x):
        # 返回能被2整除的数
        return x % 2 == 0
    
    
    list1 = [1, 2, 3, 4, 5, 6]
    # 过滤出能满足被2整除的数据
    result = filter(func, list1)
    print(result)  # <filter object at 0x0000020273ACAB88>
    print(list(result))  # [2, 4, 6]
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值