1

我有这两个功能:

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

4 回答 4

7

好吧,你可以创建自己可爱的函数组合函数:

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)

您可以以任何您喜欢的方式应用这些功能,并且可以以任意多种方式应用这些功能。在本网站的帮助下,这个答案成为可能。

于 2013-11-07T18:04:24.263 回答
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)
于 2013-11-07T17:53:12.973 回答
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)
于 2013-11-07T17:53:46.210 回答
0

您的swap_joker1函数返回afileor None,这使合成有点困难。

假设它实际上是:

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)
于 2013-11-07T17:54:31.783 回答