08 函数式编程
文章目录
- 1 高阶函数
- 1.1 map()
- 1.2 reduce()
- 1.3 filter()
- 1.4 sorted()
- 2 匿名函数
- 3 闭包和装饰器
- 4 偏函数
1 高阶函数
Python 中的函数是“一等函数”,所谓“一等函数”指的就是函数可以赋值给变量,函数可以作为函数的参数,函数也可以作为函数的返回值。把一个函数作为其他函数的参数或返回值的用法,我们通常称之为“高阶函数”。
在Python中,func()
是函数调用,func
是函数本身,可以把函数本身赋值给变量,也就是:变量指向函数。
print(abs(-1)) # 1
print(abs) # <built-in function abs>f = abs # f指向了abs函数
print(f(-5)) # 5 现在f等价于abs
其实函数名本身也是变量,函数名指向函数。
函数能接收变量,变量可以指向函数,所以函数可以接受函数,这时传递的不是数据,而是计算逻辑。
def func(compute, x, y): print(compute(x, y)) def add(x, y): return x + y func(add, 5, 10)
1.1 map()
map()
接收两个参数,一个是函数,一个是可迭代对象Iterable
,map()
将函数依次作用到可迭代对象的每个元素,并将结果作为一个新的迭代器对象Iterator
返回。
def f(x):return x * x# 将f作用到列表中的每一个元素
r = map(f, [1, 2, 3, 4, 5, 6])
print(list(r))
上述代码中,由于map()
返回的是一个惰性序列Iterator
,所以通过list()
把整个序列算出来返回一个list
。
输入一行数据作为列表:
ls = list(map(int, input().split(' ')))
1.2 reduce()
reduce()
把一个函数作用到一个序列中,其中这个函数必须接收两个参数,reduce()
将计算结果继续和下一个元素累计计算。
使用reduce()
需要导入from functools import reduce
。
from functools import reduce
def add(x, y):return x + yprint(reduce(add, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])) # 累加求和 55# 使用lambda匿名函数
print(reduce(lambda x, y: x + y, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]))
1.3 filter()
filter
接收一个函数一个序列,把传入的函数作用到每一个元素上,根据返回值决定是否保留,True
保留元素,False
丢弃元素。最终结果作为Iterator
返回,也就是一个惰性序列,需要使用list()
获取所有计算结果。
def f(x):return x % 2 == 0# 求出0~100的所有偶数
ls = list(filter(f, [i for i in range(101)]))ls = list(filter(lambda x: x % 2 == 0, [i for i in range(101)]))
1.4 sorted()
sorted()
可以对序列进行排序,返回一个新的列表。
ls = sorted([4, 3, 2, 5, 1])
还可以接收一个key
函数实现自定义排序,key
将指定函数作用到序列的每一个值上,并按照返回值进行排序。另外还可以使用reverse=True
表示逆序排列。
def f(x):return x[1]ls = [('bob', 70), ('alice', 80), ('carl', 100)]# 按照第二个元素分数进行排序
ls = sorted(ls, key=f)# 使用lambda并且逆序排列
ls = sorted(ls, key=lambda x: x[1], reverse=True)
2 匿名函数
def
关键字,可以定义带有名称的函数lambda
关键字,可以定义匿名函数(无名称)
有名称的函数,可以基于名称重复使用。无名称的匿名函数,只可临时使用一次。
表达式内容自动成为返回值,不可使用return
。
lambda 传入参数: 函数体(一行代码)
实例:
def func(compute, x, y): print(compute(x, y)) # 传入一个一次性的函数
func(lambda x, y: x * y, 10, 5)
3 闭包和装饰器
4 偏函数
Python的functools
模块提供了很多有用的功能,其中一个就是偏函数(Partial function)。
偏函数可以固定函数的某些参数,生成一个新的函数,在调用时可以减少重复参数的输入,降低调用难度。
# int()默认将字符串按照10进制进行转换,可以通过base设置进制
int('152', base=8)# 固定base参数
def int2(x, base=2):return int(x, base)# functools.partial可以很方便地构造偏函数
int2 = functools.partial(int, base=2)