【循序渐进学Python】Python中的函数(四)——匿名函数与高阶函数
今天我们来学习Python函数中的灼遁·光轮疾风漆黑矢零式,听上去是不是花里胡哨,说白了就是函数中的比较难得两个模块,这两个模块分别是匿名函数和高阶函数,这两个函数在我们运用中使用较为广泛,所以我们今天来重点学习一波这两个知识点!
匿名函数
匿名函数的定义
- 匿名函数是指在python中使用lambda来创建函数,称为匿名函数
- 创建函数不再使用def来创建,而是使用lambda关键字创建一个形式主义的函数
格式
lambda 参数1,参数2...:(单行表达式或者函数调用)返回值
匿名函数的作用
- 可以通过匿名函数来实现标准函数的功能
- 可以作为一个函数的**参数进行传递,**将一个函数当成另一个函数的参数传递进另一个函数
- (全局变量)一个函数只要被声明了.肯定在内存中存放好啦.
- 程序运行函数即被创建,内存被分配,直到整个文件执行结束才会被处理
- 使用匿名函数传递只有当这个函数被传递的时候开始创建,内存分配,这个函数执行完毕,匿名函数就会像局部变量一样只在这个函数内部存在,函数执行完毕,匿名函数也被释放
匿名函数的特点
- 匿名函数本质是一个表达式,不是代码块
- 匿名函数只能写一行代码
- 使用关键字lambda
- 如果有返回值数据类型不需要书写return关键字
- lambda的函数要比def函数简单的多
- lambda中不能使用if语句、while语句、for循环,但是可以使用单行的表达式或函数调用
- lambda的返回结果不需要使用return
- 仅仅能在lambda表达式中封装有限的逻辑进去
函数的本质
- 函数本质是一个代码块集合,而函数名的作用是针对代码块集合的一个引用
- 函数名可以理解为一个变量,这个变量里面引用的是函数主体所有代码
匿名函数使用场景
一般在实际开发中有两种使用场景
- 定义一个简单的单行函数
- 一个函数要作为另一个函数的参数进行传递(重点)
实例:
# 无参无返回值函数
# def fun1():
# print("hello")
# fun1 = lambda : print("hello")
# fun1()
# 有参无返回值函数
# def fun2(str):
# print("hello%s" % str)
# fun2 = lambda str : print("hello%s" % str)
# fun2("aa")
# 无参有返回值函数
# def fun3():
# return "hello"
# fun3 = lambda : "hello"
# print( fun3())
# 有参有返回值函数
# def fun4(a):
# return "hello%s" % a
# fun4 = lambda a :"hello%s" % a
# print(fun4("aa"))
案例:
# 需求:使用匿名函数实现两个数之间的运算.
fun1 = lambda a, b: a + b
ret = fun1(4, 5)
print(ret)
fun2 = lambda a, b: a - b
rey = fun2(9, 2)
print(rey)
fun3 = lambda a, b: a * b
res = fun3(4, 5)
print(res)
fun4 = lambda a, b: a // b
rel = fun4(6, 3)
print(rel)
高阶函数
常用的高阶函数有map,reduce,filter.
map用法
- map会根据提供的函数对指定序列做映射
- 方法中第一个参数是定义的函数,对参数序列中的每一个元素进行调用该函数,最终返回一个map对象
- 这个map对象其本质是每个元素执行完定义的函数之后由重新组成的列表
案例:
# 需求:将指定列表中的每个元素进行求平方输出一个新列表
my_list = [1, 3, 5, 7, 9]
new_list = map(lambda x: x ** 2, my_list)
# map函数的作用就是,设置每个my_list中的元素传入fun方法执行完成之后,进行返回一个map对象
print(list(new_list))
# 需求:将一个列表中所有的单词的首字母大写
my_list = ["smith", "tom", "jerry", "john", "obama"]
def fun(x):
return x.capitalize()
res = map(fun, my_list)
print(list(res))
reduce用法
-
reduce函数会对参数序列中元素进行累计
-
reduce高阶函数中第一个参数是函数,第二个参数是需要进行操作的数据,
- 函数将一个数据集合中的所有数据进行函数中的操作
reduce高阶函数的运算流程:
- 先对集合中的第1、2个元素运用函数计算得到的结果再与第三个元素运用函数进行计算,以此类推,最后得到一个最终的结果
案例:
import functools
# 需求:求出列表中所有数据的和
my_list = [2, 5, 6, 7, 9]
def fun(x1, x2):
return x1 + x2
res = functools.reduce(fun, my_list)
print(res)
filter用法
- filter方法用于过滤序列,过滤掉不符合条件的元素,返回一个filter对象,如果要转换为列表可以使用list()来转换
- 该方法接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回True或False,最后将返回True的元素放到新的序列中
案例:
# 需求:将1-20内所有能被3整除的数寻找出来
my_list = [i for i in range(1, 21)]
res = filter(lambda x: x % 3 == 0, my_list)
print(list(res))