高阶函数二
Currying
currying这个单词怎么翻译?给个例子,比如说我要计算x的y次方,通常我们都会定义一个函数,把x,y作为参数传进去计算,现在我们定义一个高阶函数,内外层函数都只传一个参数,这种方法就是currying
def curried_pow(x):
def h(y):
return pow(x, y)
return h
有些时候,我们只传入一个参数时,这种方法可以应用起来,比如说现在给你一个函数
def map_to_range(start, end, f):
while start < end:
print(f(start))
start = start + 1
你现在要打印2的0次方到2的10次方,那么你可以这样调
map_to_range(0, 10, curried_pow(2))
这种方式使得我们的调用很广泛,也很自由。
在上面的例子中,我们用pow函数得到curried_pow函数,既然这样,我们是不是可以这样写
def curry2(f):
def g(x):
def h(y):
return f(x, y)
return h
return g
比较上面的函数,是不是多了一层,其实如果要想实现上面的功能把
f
f
f传进去脱一层,不是一模一样吗?
我们可以这样调
pow_curried = curry2(pow)
map_to_range(0, 10, pow_curried(2))
那么利用这种方法我除了可以计算次方外是不是也可以计算其他运算。
现在看另一种方法,这种方法可以逆转他们的顺序:
def uncurry2(g):
def f(x, y):
return g(x)(y)
return f
我们举个例子哈:比如说我们现在调一下curry2(f)(x)(y),实际上我们得到f(x,y).那么如果我现在调uncurry(curry2(f)),那么就会得到 f。不过我现在还不是很清楚它的具体写法和应用。
Lambda 表达式
敲黑板,重点来了,回顾一下我们是怎么定义函数的,现在我们引入一种新的方法,没有名字,没有赋值和条件语句。它就是Lambda 表达式。看个例子:
def compose1(f, g)
return lambda x: f(g(x))
我们理解一下这行代码
lambda x: f(g(x))
冒号前面是传入参数,冒号后是返回值,继续看代码:
def compose1(f, g):
return lambda x: f(g(x))
f = compose1(lambda x: x * x, lambda y: y + 1)
result = f(12)
在python中,我们一般传入一个参数,返回一个返回值,在学习初期,可能你会对Lambda的语法感到疑惑,你可以把Lambda表达式拆解为普通函数,可能会对你的理解有帮助。
本文部分来自作者学习 composing programs的笔记