Functional Programming:函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。
函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。
函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!
Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。
一、高阶函数
函数本身也可以赋值给变量,即:变量可以指向函数。
函数名其实就是指向函数的变量
abs
函数实际上是定义在
import builtins
模块中的,所以要让修改
abs
变量的指向在其它模块也生效,要用
import builtins; builtins.abs = 10
。
一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
1、map()
map()
函数接收两个参数,一个是函数,一个是Iterable
。map
将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator
返回。
def add(x, y, f):
return f(x)+f(y)
print(add(5,-6,abs))
def f(x):
return x*x
r = map(f, [1,2,3,4,5,6,7,8,9])
print(list(r)[:])
reduce
把一个函数作用在一个序列[x1, x2, x3, ...]
上,这个函数必须接收两个参数,reduce
把结果继续和序列的下一个元素做累积计算
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
from functools import reduce
def add(x,y):
return x+y
a = reduce(add,[1,3,5,7,9])
print(a)
from functools import reduce def char2num(s): return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s] def str2int(s): return reduce(lambda x,y:x*10+y,map(char2num,s)) a = str2int('13579') print(a)
#Test3:
# -*- coding: utf-8 -*- from functools import reduce def str2float(s): def char2num(s): return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s] def fn(x,y): return x*10+y n = s.index('.') p = len(s) - n - 1 return reduce(fn, map(char2num, s[0:n]+s[n+1:]))/10**p
def str2float(s): def char2num(m): return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, '.': '.'}[m] def fn(x, y): if y == '.': return x else: return x*10+y l = list(map(char2num, s)) n = l.index('.') p = len(l) - n - 1 return reduce(fn, l)/10**p
print('str2float(\'123.456\') =', str2float('123.456'))
3、filter
Python内建的
filter()
函数用于过滤序列。和
map()
类似,filter()
也接收一个函数和一个序列。和map()
不同的是,filter()