我有这两个功能:
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的新函数?
答案 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
函数会返回afile
或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)