2017-07-02 18 views
1

私はPythonのいくつかの問題を解決しています その1つでは、 examplefunction([1, 2, 3, 4])(10)が返ってくる関数何かがちょうど10と言うことができます。Pythonで(var1)(var2)表記を使用して値に関数を適用する方法

問題は、これまでPythonで関数を呼び出すのにdouble ()()を使って表記を見たことがありません。

私は、このような Python: Apply function to values in nested dictionary

として、スタックオーバーフロー上の複数の投稿を見てみました。しかし、このような疑いは本当にありません。

+0

ご質問は具体的な方法で回答するにはあまりにも曖昧です。簡単な答えは、関数を返すために 'examplefunction'が必要だということです。それを "double()()"とは考えないでください。値を返すのはone()です。その値は関数であり、second()で呼び出されます。 – BrenBarn

+0

'()()'は* a *関数を呼び出しません。 – chepner

+0

@chepnerそうかもしれない。関数がそれ自身を返すと、それは* a *関数を呼び出します(2回)。 –

答えて

7

object()()は、ちょうど_result = object()_result()です。最初の呼び出しが呼び出し可能なオブジェクトを返す限り、2番目の呼び出し式は続行できます。

examplefunction()呼び出しで別の関数が返されましたか?機能はあまりにもオブジェクトなので、あなただけの既存の関数を返すことができます:

def examplefunction(): 
    return secondfunction 

def secondfunction(): 
    return 10 

た時点examplefunction()()10を生成します。

また、その本体の一部としてその関数オブジェクトを定義することによって、あなたのexamplefunction()呼び出しは、新しい関数オブジェクトごとに生産することができます:

def examplefunction(): 
    def nestedfunction(): 
     return 10 
    return nestedfunction 

これは、同じ結果が得られますが、nestedfunction()が持っているという追加の利点examplefunction(これらは、クロージャと呼ばれます)で定義されたすべてのローカル名へのアクセスを許可(読み取り)します。私はあなたの割り当てはあなたにこれらの原則を教えしようとしていると思われる

def examplefunction(base): 
    def nestedfunction(): 
     return base * 2 
    return nestedfunction 

examplefunction(5)() # produces 10 

:これは、あなたはどのように振る舞うnestedfunction() parameteriseすることができます。

2

関数には複数のパラメーターがありません。これらはネストされた関数、または他の関数を組み込んだ関数を指しています。例えば

def func(a): 
    def func2(b): 
     return a + b 
    return func2 

は次のように呼び出されます:だから、2つのパラメータブラケットがあります表示されます

func(1)(2) 

(とその答えとして3返します)

が、実際に彼らは2つの異なる機能のためです!

希望すると助かります!

Source

1

あなたが(...)(...)が表示された場合には、関数呼び出しが連鎖していることを意味し、第一の機能は、別の関数を返します。

例:

def fn1(val1): 
    def fn2(val2): 
     print("{} {}".format(val1, val2)) 
    return fn2 

fn1("Hello")("World") # -> "Hello World" 

# you can also write this as: 
var1 = fn1("Hello") 
var1("World") 
関連する問題