主要内容:
一、递归函数
1、什么是递归函数:
在函数的定义中,函数内部的语句调用函数本身。
2、应用场景:
遍历一个文件夹下的所有文件;快排等一些算法
3、特点:
- 自己调用自己
- 必须有一个明确的结束条件;(否则陷入死循环,报错)
- 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
- 相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入)。
- 递归效率不高,递归层次过多会导致栈溢出。
(在计算机中,函数调用是通过栈(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、特点:
- 只有一个返回值
- 只有一句表达式
- 能接收任何数量的参数,函数的参数在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]