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))