2017-12-31 222 views
2

次のコードが動作する方法はありますか?引数としての部分関数呼び出しpython

def f1(f2, x): 
    return f2(x) 

def f2(y, z): 
    return y + z 

f1(f2(10,), 20) 
output 30 

f2機能はzをミス。だから、私はf1xという引数をf2zとして渡したいと思います。 私は何か助けていただければ幸いです。

+0

'def'、' lambda'や 'functools.partial'を使って作成された、例えば' f1(lambda z:f2(10、z)、20) 'を使って呼び出し可能な引数を渡す必要があります。 – jonrsharpe

+0

@jonrsharpeここでの目的は、ある関数から別の関数に引数を渡すことに焦点を当てていますが、この質問は呼び出し中に引数を部分的に渡すことに焦点を当てています。私はこれが適切な偽装ターゲットではないと思う。 –

+0

OP FYIこれらの多くは、あなたの質問のタイトルプラス 'site:stackoverflow.com'を検索することによっても見つけられるので、今後尋ねる前に研究をしてください。 – jonrsharpe

答えて

5

はい、これはfunctools.partialがすべてに約あるものです:

from functools import partial 

f1(partial(f2,10), 20)

partialが入力として機能f、パラメータの名前無名のの任意の数をとります。名前のないパラメータと名前付きパラメータがすでに埋め込まれている新しい関数を作成します。

とやや同等です:上記の実装と比較して有意にオーバーヘッドを削減します

def partial(func, *partialargs, **partialkwargs): 
    def g(*args, **kwargs): 
     fargs = partialargs + args 
     fkwargs = partialkwargs.copy() 
     fkwargs.update(kwargs) 
     return func(*farg, **fkwargs) 
    return g 

しかしfunctoolslambda表現を示す

+0

ありがとうございます。出来た! – Masa

4

別のオプション:@Willemによって示されるように

f1(lambda x: f2(10,x), 20) 

部分は、あなたの特定の問題に適していますが、lambda表現は、柔軟性のために知ってもいいです - 式がちょうどそのはるかに複雑になることができます部分的な呼び出し。

関連する問題