2017-12-16 15 views
0

これは私のコードです。印刷時にエラーの原因を教えてください。関数composeは、関数の構成を計算することになっています。**またはpow()のサポートされないオペランドタイプ: 'function'および 'int'

最後の行 f1(f2)
def compose(lst): 
    return acc(g, h, lst) 
print(compose([lambda x:x**2,lambda y:2*y])(5)) 
def acc(f, v, lst): 
    if len(lst)==0: 
     return v 
    if len(lst)==1: 
     return f(v,lst[0]) 
    return f(lst[0], acc(f,v,lst[1:])) 
def h(f): 
    return f 
def g(f1,f2): 
    return f1(f2) 

答えて

2

ような何かをする必要がint型5.

関数gは、実際には引数を持つf2を呼び出します。

def g(f1, f2): 
    def func(*args, **kwargs): 
     return f1(f2(*args, **kwargs)) 
    return func 

print(compose([lambda x: x**2, lambda y: 2*y])(5)) 

出力:

>>> (lambda x: x**2)((lambda y: 2*y)(5)) 
100 
1

f1に与えられた引数がf2です(ラムダ)、ではないあなたが作る必要がありlst[0](lst[1](x))

+0

しかし、私は作曲(following'printを印刷するときにエラーがまだ表示されます([ラムダX:X ** 2、ラムダY:

100 

これはと等価である2 * y])) ' – Programmingfreak

+0

これは、その行で起こるのは、エラーコードが実際に実行されるためです。 'def g(f1、f2):return f1(f2)'を見ると、f1とf2は何でもかまいません。その時点で、そのコードが失敗するかどうかを判断する方法はありません。 'f1 = lambda x:x ** 2'と' f2 = lambda:2 * y'というパラメータ値で関数 'g'が呼び出されたときだけエラーが発生します。 '(lambda:2 * y)** 2'を走らせて、あなたが見るエラーを引き起こします。 –

+1

ありがとうございます!これは、関数 'g'の最後の行を' return lambda x:f1(f2(x)) 'に変更したときに働きました。 – Programmingfreak

関連する問題