您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python避免使用lambda作为需要两个可调用对象的键(函数组合)

Python避免使用lambda作为需要两个可调用对象的键(函数组合)

如果有一个compose功能的话- 也许在里面会很可爱functools。没有,我也不指望会有,。用Raymond Hettinger的话来说,

先前已在其他论坛中进行了讨论和拒绝。问题之一是通常的数学顺序是不直观的,并且不能自我证明-即compose(f,g)f(g(x))g(f(x))?相同。此外,它已经是污垢容易创建自己构建功能,或者直接做组成: h = lambda x: f(g(x))

这里有两个简单的实现方式compose一个调用的类,可能对你有用,但:

# Scott Daniels, http://code.activestate.com/recipes/52902-function-composition/
# Lightly edited for style.
class Compose(object):
    '''Compose functions. compose(f,g,x...)(y...) = f(g(y...),x...))'''
    def __init__(self, f, g, *args, **kwargs):
        self.f = f
        self.g = g
        self.pending = args[:]
        self.kwargs = kwargs.copy()

    def __call__(self, *args, **kwargs):
        return self.f(self.g(*args, **kwargs), *self.pending, **self.kwargs)


class Starcompose:
    '''Compose functions. Starcompose(f,g,x...)(y...) = f(*g(y...),x...))'''
    TupleType = type(())

    def __init__(self, f, g, *args, **kwargs):
        self.f = f
        self.g = g
        self.pending = args[:]
        self.kwargs = kwargs.copy()

    def __call__(self, *args, **kwargs):
        mid = self.g(*args, **kwargs)
        if isinstance(mid, self.TupleType):
            return self.f(*(mid + self.pending), **self.kwargs)
        return self.f(mid, *self.pending, **self.kwargs)

另外,请参阅该functional软件包,它启发compose_many了我的这个非常简单的功能

def compose(f1, f2):
    def composition(*args, **kwargs):
        return f1(f2(*args, **kwargs))
    return composition

def compose_many(*funcs):
    return reduce(compose, funcs)
python 2022/1/1 18:37:43 有239人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶