一見鍾情不太明朗。讓我們來分解:
首先,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))
這是採取兩種功能acc
和fn
並返回lambda函數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))
將返回一個(lambda)函數,它將返回acc(fn(the_arguments))
。
reduce(lambda acc, fn: lambda *args: acc(fn(*args)), fns, lambda _: _)
將返回一個函數,該函數包含將fns
的每個函數應用於其參數,默認情況下爲標識(lambda _: _
)。
讓我們舉個例子:
>>> 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)))
隨着Kasramvd's example:
compose(max, min)([[2, 4], [3, 5]])
是一樣的:
max(min([[2, 4], [3, 5]]))
min([[2, 4], [3, 5]])
意願返回[2,4]
和max([2,4])
是4。因此compose(max, min)([[2, 4], [3, 5]])=4
這真是一個令人困惑的函數。感謝您使它變得非常簡單。 –