Higher Order Funcrtions

Higher Order Funcrtions

让我们做一个功能组合

>>> def combine_funcs(op):
>>> """combine funcs(OP)(f,g)(x)=OP(f(x),g(x))"""
>>> 	def combine(f,g):
>>> 		def val(x):
>>> 			return op(f(x),g(x))
>>> 		return val
>>> 	return combined

功能实例

def combine_func(op):
	def combined(f,g):
		def val(x):
			return op(f(x),g(x))
		return val
	return combined
from operator import add
add_func=combine_func(add)
from math import sin,cos,pi
h=add_func(sin,cos)
h(pi/4)

为什么要返回val和combined,而不是val(x),combined(f,g)?
combined直至h=add_func(sin,cos)之前都没有赋值,这里的return combined是返回combined函数本身而不是调用后的结果,同样的在没对val赋值时返回的也只是函数val

challenge: Conditional Function

是否可以写一个python函数if_func: if_func(x/1,x>0,0)
使得返回值和条件语句1/x if x>0 else 0

  • 答案是不行的,函数调用时会计算操作数也就是已经计算好了1/x

但是我们可以这样写

define if_func(then_expr,condition,else_expr):
	return then_expr() if condition else else_expr()

之后这样调用:

if_func(lambda: 1/x,x>0,lambda:0)
到目前为止,每当我们想要定义一个新函数时,都需要给它取一个名字。但是对于其他类型的表达式,我们不需要将中间值与名称相关联。也就是说,我们可以计算 `a * b + c * d` 而不必命名子表达式 `a*b` 或 `c*d` 或完整的表达式。在 Python 中,我们可以使用 lambda 表达式临时创建函数,这些表达式会计算为未命名的函数。一个 lambda 表达式的计算结果是一个函数,它仅有一个返回表达式作为主体。不允许使用赋值和控制语句。
>>> def compose1(f,g):
>>> return lambda x: f(g(x))

可以构造相应的句子理解:

lambda           x       :           f(g(x))
A function that  takes x and returns f(g(x))
posted @ 2024-01-03 20:01  viewoverlook  阅读(3)  评论(0编辑  收藏  举报