一見するとあまり読みにくくありません。
まず、def compose(*fns):
は、作成関数が未知数の引数を受け取ることを意味します。
次は、機能を減らす分解してみましょう:
reduce(
lambda acc, fn: lambda *args: acc(fn(*args)),
fns,
lambda _: _
)
docが示すように、reduce
は3つの引数を取ります。
だから、
def reduce(function, iterable, initializer=None):
、あなたのケースで:function
はlambda acc, fn: lambda *args: acc(fn(*args))
あり、fns
がありますiterable
と初期化されます。lambda _: _
initializer
は、compose
の引数が関数になることを示します。 lambda _: _
は、関数の中立要素です(加算の場合は「0」、乗算の場合は「1」と同じです)。私はそれが本質的にfnsが空の時だと思う。メイン部分のための今
:
lambda acc, fn: lambda *args: acc(fn(*args))
これは2つの機能acc
とfn
を取る関数であり、ラムダ関数lambda *args: acc(fn(*args))
を返します。
はのは例を見てみましょう:ここ
>>> reduce((lambda acc, fn: acc ** fn), [1, 2, 3, 4])
1
>>> reduce((lambda acc, fn: fn ** acc), [1, 2, 3, 4])
262144
ACCおよびfnは、関数が、整数ではありません。 acc
はこれまでの「蓄積/減少」であり、fn
は「次の」ステップである。
機能を使用すると、これまでと同じようになります。acc
は、これまでの「関数」と呼ばれ、次の関数はfnとなります。
したがってlambda acc, fn: lambda *args: acc(fn(*args))
は(λ)関数を返します。この関数はacc(fn(the_arguments))
を返します。
reduce(lambda acc, fn: lambda *args: acc(fn(*args)), fns, lambda _: _)
は、fns
の各関数をそのargsに適用して、デフォルトでID(lambda _: _
)を持つ関数を返します。 Kasramvd's exampleで
>>> def square(x):
... return x**2
...
>>> def increment(x):
... return x+1
...
>>> def half(x):
... return x/2
...
>>> compose(square, increment, half)
<function <lambda> at 0x7f5321e13de8>
>>> g=compose(square, increment, half)
>>> g(5)
9
ので、g(x) = square(increment(half(x)))
:
のは例を見てみましょう
:
compose(max, min)([[2, 4], [3, 5]])
は同じであり、 0
min([[2, 4], [3, 5]])
意志[2,4]
を返し、max([2,4])
もlambda
を使用して定義され、従うことが困難であり、特に新たな機能を返しこのいずれかとなることができるこのようcompose(max, min)([[2, 4], [3, 5]])=4
これは本当に混乱する関数です。本当にシンプルにしてくれてありがとう。 –