python的函数式编程
函数是编程是什么
- 函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量
- 只要输入是确定的,输出就是确定的
- 允许把函数本身作为参数传入另一个函数,还允许返回一个函数
高阶函数
- 高阶函数就是接收函数作为参数的函数或者是返回函数作为结果的函数。
函数与变量
函数本身可以赋值给变量
函数名是指向函数的变量
传入函数
def add(x, y, f):
return f(x) + f(y)
内置的高阶函数
map
- 接收两个参数,一个是函数,另一个是可迭代对象。返回值也是一个迭代器
- 把传入的函数依次作用在可迭代对象的每个元素上,并把结果作为新的可迭代对象返回
def add(x, y):
return x + y
r = map(add, [1, 2], [3, 4])
reduce
- 接收两个参数,一个是函数,另一个是可迭代对象。返回值为一个结果
- reduce将前一个元素结果作用在后一个元素上。
- 就是复合函数
def fn(x, y):
return x* 10 + y
def char2num(s):
digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
return digits[s]
reduce(fn, map(char2num, '13579'))
filter
- filter 用于过滤序列
- filter接收一个函数和一个序列
- 函数返回值
True
的元素组成新的序列,否则被丢弃
def is_even(x):
return x % 2 == 0
r = list(filter(is_even, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
print(r)
sorted
- sorted是一个内置函数,接收可迭代对象作为参数,返回排序后的新列表
- 也可以接收一个key函数,来实现自定义排序
- 根据key函数返回的的结果进行排序
sorted([36, 4, -12, 9, -21], key=abs)
函数作为返回值
将函数作为结果值返回
def clac_sum(*args):
ax = 0
for n in args:
ax += n
return ax
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax += n
return ax
return sum
f = lazy_sum(1, 3, 5, 7, 9)
f()
闭包
当一个函数返回了另外一个函数时,被返回的函数就是闭包。
- 闭包是指有权访问另一个函数作用域中变量的函数。
def count():
fs = []
for i in range(1, 4):
def f():
return i* i
fs.append(f)
return fs
f1, f2, f3 = count()
返回函数不要引用任何循环变量,或者后续会发生变化的变量
使用闭包时,对外层变量赋值前,需要先使用nonlocal声明该变量不是当前函数的局部变量。
匿名函数
python的lambda
- 只能写一个表达式,不用写return
- lambda也是个函数对象,所以也能被赋值,作为参数传递给别的函数。
list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9])))
装饰器
- 装饰器是一个函数,它接收另外一个函数作为参数,并返回一个新的函数
- 可以用来修改函数的功能
def log(func):
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper
偏函数
类似C++的bind,
能够固定一些参数,返回一个新的函数
int2 = functools.partical(int,base=2)
int2('100000')