質問: logger(accumulate) print(newfunc(1, 2)) ``` 出力結果 引数:(1, 2) 3 上記プログラムのinner(*args)にaccumulate(a, b)の引数(a, b)が渡される理由が理解できません。 そもそも、関数の引数として関数が渡されるとどういった順序で引数側の関数に引数が渡され、 処理されるかといったことも理解てきておりません。。 また、上記の出力するためのコードも ``` logger(accumulate(1, 2)) ``` ではなく、 ``` (logger(accumulate))(1, 2) ``` となっているように感じるのですが、 認識誤りでしょうか? 仮に、下記になっている場合どのような処理となるのか、 お教えいただけると大変助かります。 お手数をおかけいたしますが、 ご教示いただけますと幸いです。 よろしくお願いいたします。
回答: logger(accumulate)が呼び出されたとき、innerが返されますよね? これは関数オブジェクトを返しているということで、それをnewfuncが受け取っているので、 newfunc = innerということになります。 innerが返される前にloggerで渡された引数により、返されるinnerは ``` def inner(*args) print('引数:', args) return accumulate(*args) ``` こうなります。 つまり、newfunc(1, 2)という呼び出しは、inner(1, 2)ということになりprint関数が呼ばれた後にreturnでacuumulate(1, 2)の結果が返されるということになるのです。 pythonの関数がオブジェクトだというのは、 ``` print(logger.__class__) # ``` この結果をみれば分かると思います。