python 函数式编程:高阶函数,map/reduce

时间:2023-03-08 17:50:22
python 函数式编程:高阶函数,map/reduce

python 函数式编程:高阶函数,map/reduce

 #函数式编程
#函数式编程一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数
#(一)高阶函数 f=abs
f
print(f(-20))
#结果 20
#函数可以赋值给一个变量,即:变量可以指向函数
#那么函数名是什么?函数名其实就是指向函数的变量! #下面的代码,执行后,abs已经不指向求绝对值函数而是一个整数10了。
#后面的abs(-10)将报错,无法执行,必须重启python才可以。
#abs=10
#abs(-10) #一个简单的高阶函数
#所谓高阶函数,即是可以把函数作为其参数传入。
def add(x,y,f):
return f(x)+f(y) print(add(-5,6,abs)) #演示高阶函数map()/reduce()
#map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次
#作用到序列的每个元素,并把结果作为新的Iterator返回
#比如我们有一个函数f(x)=x^2,要把它作用在一个list[1,2,3,4,5,6,7,8,9]上 def f(x):
return x*x
r=map(f,[1,2,3,4,5,6,7,8,9])
#Iterator是个迭代器,即是个惰性序列,需要list()函数让它把整个序列计算出来返回一个list
print(list(r))
#结果 [1,4,9,16,25,36,49,64,81] #map()作为高阶函数,事实上它把运算规则抽象了。
#再来一个例子,把list所有数字转为字符串
print(list(map(str,[1,2,3,4,5,6,7,8])))
#结果 ['1', '2', '3', '4', '5', '6', '7', '8'] #reduce()函数
#它的效果就是:
#reduce(f,[x1,x2,x3,x4])=f(f(f(x1,x2),x3),x4)
from functools import reduce
def fn(x,y):
return x*10+y print(reduce(fn,[1,3,5,7,9]))
#结果:13579, 即把序列转成了一个整数 #另一个例子,实现int()函数的功能
def str2int(s):
def fn(x,y):
return x*10+y
def char2num(s):
return {'':0,'':1,'':2,'':3,'':4,
'':5,'':6,'':7,'':8,'':9}[s]
return reduce(fn,map(char2num,s))
print(str2int(''))
#结果 784533 #还可以用lambda函数进一步简化成
def char2num(s):
return {'': 0, '': 1, '': 2, '': 3, '': 4,
'': 5, '': 6, '': 7, '': 8, '': 9}[s]
def str2int(s):
return reduce(lambda x,y:x*10+y,map(char2num,s))
print(str2int(''))
#结果 743092