如何在python中组合两个或多个函数

时间:2013-11-07 17:46:50

标签: python

我有这两个功能:

def swap_joker1(afile):
    idx = afile.index(27)
    if idx == len(afile) - 1:
        afile[idx],afile[0]=afile[0],afile[idx]
    else:
        afile[idx],afile[idx+1]=afile[idx+1],afile[idx]
        return afile

def swap_joker2(afile):
    idx = afile1.index(28)
    afile[idx],afile[idx+1],afile[idx+2]=afile[idx+1],afile[idx+2],afile[idx]
    return afile

我怎样才能将它们组合在一起。并成为一个名为cipher_functions的新函数?

4 个答案:

答案 0 :(得分:3)

一些方法:

cipher_functions = lambda afile:swap_joker2(swap_joker1(afile))
def cipher_functions(afile):
    return swap_joker2(swap_joker1(afile))

import functional #third party, not maintained. Alternatives exist
cipher_functions = functional.compose(swap_joker1, swap_joker2)

答案 1 :(得分:3)

好吧,你可以创建自己的可爱功能组合功能:

import functools


def compose(*functions):
    return functools.reduce(lambda f, g: lambda x: f(g(x)), functions)


def foo(var):
    return var // 2


def bar(var):
    return var + 1

if __name__ == '__main__':
    # Apply bar, then foo
    composition = compose(bar, foo)
    print composition(6)

您可以以任何您喜欢的方式应用这些功能,并以您喜欢的方式应用。在this website的帮助下,这个答案成为可能。

答案 2 :(得分:1)

如果Python提供了一个合成运算符,那就太好了。不幸的是,你需要自己做。

def cipher_functions(afile):
    # This is f(g(x)); swap for g(f(x)) if necessary
    return swap_joker1(swap_joker2(afile))

您可以轻松定义合成功能:

def compose(f, g):
    return lambda *args, **kwargs: f(g(*args, **kwargs))

cipher_functions = compose(swap_joker1, swap_joker2)

答案 3 :(得分:0)

您的swap_joker1函数会返回afileNone,这会使合成变得有点困难。

假设它实际上是:

def swap_joker1(afile):
    idx = afile.index(27)
    if idx == len(afile) - 1:
        afile[idx],afile[0]=afile[0],afile[idx]
    else:
        afile[idx],afile[idx+1]=afile[idx+1],afile[idx]
    return afile

无条件地返回afile,你可以简单地将作文写为:

def cipher_functions(afile):
    return swap_joker2(swap_joker1(afile))

更一般地说:

def compose(f, g):
    "Returns x -> (f o g)(x) = f(g(x))"
    def fog(*args, **kwargs):
        return f(g(*args, **kwargs))
    return fog

cipher_functions = compose(swap_joker2, swap_joker1)