高阶函数二

高阶函数二

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的笔记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值