函数式编程
- 函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数
- Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言
高阶函数
map函数
- 将可迭代对象作用到函数中,返回一个map对象
- map()作为高阶函数,它把运算规则抽象化了
map(func, *iterables) ---> map object
>>> def f(x):
... return x * x
...
>>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
['1', '2', '3', '4', '5', '6', '7', '8', '9']
reduce函数
- reduce把一个函数作用在一个序列[x1, x2, x3, …]上,这个函数必须接收两个参数
- reduce把结果继续和序列的下一个元素做累积计算
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
# 把序列[1, 3, 5, 7, 9]变换成整数13579
>>> from functools import reduce
>>> def fn(x, y):
... return x * 10 + y
...
>>> reduce(fn, [1, 3, 5, 7, 9])
13579
filter函数
- filter()函数用于过滤序列
- filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素
# 删掉list中的偶数
def is_odd(n):
return n % 2 == 1
list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 结果: [1, 5, 9, 15]
- filter()函数返回的是一个Iterator,也就是一个惰性序列,所以要强迫filter()完成计算结果,需要用list()函数获得所有结果并返回list
sorted函数
- sorted()函数就可以对list进行排序
- sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序
- 默认情况下,对字符串排序,是按照ASCII的大小比较的
>>> sorted([36, 5, -12, 9, -21])
[-21, -12, 5, 9, 36]
>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]
返回函数
- 一个函数可以返回一个计算结果,也可以返回一个函数。
- 返回一个函数时,牢记该函数并未执行,返回函数中不要引用任何可能会变化的变量
匿名函数-lambda
- 直接使用匿名函数比定义函数简单时使用
>>> list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
[1, 4, 9, 16, 25, 36, 49, 64, 81]
- 关键字lambda表示匿名函数,冒号前面的x表示函数参数
- 匿名函数只能有一个表达式,不用写return;返回值就是该表达式的结果
装饰器
-
在代码运行期间动态增加函数功能的方式,称之为“装饰器”
-
实现原理:基于@语法和函数闭包,将原函数封装在闭包中,然后将函数赋值为一个新的函数(内层函数),执行函数时再在内层函数中执行闭包中的原函数
-
实现效果:可以在不改变原函数内部代码和调用方式的前提下,实现函数在执行时扩展功能
-
适用场景:多个函数系统统一在执行前后自定义一些功能
"""
python语法层面支持装饰器:
@函数名
def xxx():
pass
Python内部会自动执行 函数名()
并且将xxx()函数作为参数传入 函数名()
再将结果赋值给xxx()函数
等价于 xxx = 函数名(xxx)
"""
def outer(origin):
def inner(*args,**kwargs):
# 执行前
res = origin() # 调用原来的func函数
# 执行后
return res
return inner
@outer
def func():
pass
func()
偏函数
- Python的functools模块提供了很多有用的功能,其中一个就是偏函数
- functools.partial的作用就是把一个函数的某些参数固定住(设置为默认值),返回一个新函数,供我们调用
- 偏函数可以简化参数操作,当函数的某个参数可以提前获知,我们可以使用偏函数将其固定住