十五、python基础:匿名函数(lambda表达式)、高阶函数
一、匿名函数(lambda表达式)
1、什么是匿名函数?
lambda x,y : x + y
上面这个就是一个匿名函数,冒号前面是变量,冒号后面是函数体,也就是这个函数要执行的操作。
它等同于:
def add(x, y):
return x + y
匿名函数的使用场景一般就是我们的函数代码量太少了,少到我们都懒得给它起个名字了,所以直接用一行代码就给它写出来了。
不过它也有个好处,就是没有函数名,不用担心会跟别的函数冲突了。
2、怎么调用匿名函数呢?
我们在调用时,可以把它赋值给一个变量f,就相当于给它起了个名字f,接着通过变量名去调用它,最后用一个变量a去接收它的处理结果。
f = lambda x,y : x + y
a= f(1, 3)
print(a)
从这里我们也可以看出,它是自带返回值的,返回值就是函数体计算的结果。
3、匿名函数还可以直接作为另一个函数的返回值
def add(x, y):
return lambda x,y : x + y
add(1, 3)
这里需要注意一下,当它作为返回值的时候,其实冒号前面也是可以不写参数的。
def add(x, y):
return lambda : x + y
add(1, 3)
可以达到一样的效果。
不过话说回来,匿名函数的设计初衷就是为了不需要通过函数名去调用,这么写其实就没意义了。并且一般我们会把它作为一次性函数使用,在它定义的地方就直接使用了,不会在其他地方回过头去调用它。
二、高阶函数:
高阶函数就是把一个函数作为参数传给另一个函数。或者是在一个函数的返回值中,返回了另一个函数的调用(当返回的函数是它本身时,它就是递归函数)
在python内置函数中,有几个比较特别的函数,它们通过把某一个函数作为参数传递,来对序列执行特定处理
1、map()函数,它接收2个参数,第一个是函数,第二个是序列。
map函数,我们可以认为它是对序列中的每个元素逐一拎出来按照函数进行处理,处理完再一一给你放回去,最后返回的是一个对象,我们要调用list()方法把它转为列表。
def f(x):
return x * x
l = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
print(list(l))
# 输出结果是:
[1, 4, 9, 16, 25, 36, 49, 64, 81]
2、reduce()函数,它跟map类似,同样接收1个函数和一个序列,不同是,它所接收的参数必须是2个。
注意:在python3中,reduce()已经不再是内置函数,它需要从functools中引入
它的作用可以看成是,同样也是对序列执行操作,不同的是,它最后得到的是一个累加的结果。
from functools import *
def f(x, y):
return x + y
l = reduce(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
print(l)
# 输出结果是:45
当然你在序列中也可以使用字符串,可以更直观看出它的效果
from functools import *
def f(x, y):
return x + y
l = reduce(f, ['1', '2', '3', '4', '5', '6', '7', '8', '9'])
print(l)
# 输出结果是字符串:'123456789'
3、filter()函数
filter函数同样是接收一个函数和一个序列,它也是对序列的每个元素进行过滤筛选,并使用我们传入的函数作为筛选条件,过滤掉不满足要求的元素。
它跟map相同的是,一样是对序列的元素逐个处理,所以你传入的函数,只能有1个参数;
不同的是,你传入的函数的返回值,应当是一个判断条件。
def f(x):
return x % 2 == 0
l = filter(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
l = list(l)
print(l)
# 输出结果是:[2, 4, 6, 8]
4、sorted()函数
sorted()是python的内置函数,它的作用是对一个可迭代对象进行排序。
与sorted对应的,还有我们列表的sort方法,作用同样也是排序。
list = [1, 3, 4, 7, 4, 5, 9]
list.sort()
print(list)
但sort和sorted()有些不同,sort()只是作用于列表,并且无法接收函数作为参数。而sorted()它不单单可以对列表排序,还能通过key,指定一个函数作为参数,并按照该函数进行排序。
以下为sorted()函数的用法:
4.1、按照数值大小排序
sorted([3, 5, -10, 19, -1], key=abs)
4.2、按照绝对值排序
4.3、按照字母排序
字符串的排序,是根据首字母的ASCII编码来排序的,所以即使我们在上面的每个字符串后,加多一些字母,排序也不会变化
4.4、按照小写字母排序
4.5、反向排序
加个reverse=True