[英]How to define own func argument inside itertools.accumulate?
itertools.accumulate 的用法如下:
itertools.accumulate(iterable[, func, *, initial=None])
例如
list(itertools.accumulate([0, 7, 19, 13],operator.sub))
# [0, -7, -26, -39]
我在哪里使用減法運算符作為func
參數。
如何定義我自己的func
參數?
我希望它與operator.sub
類似,但不是從第一項中減去第二項,而是需要從第二項中減去第一項。
輸出[0, -7, -26, -39]
產生如下:
[0, (0) - (7), (0 - 7) - (19), ((0 - 7) - (19)) - (13)] == [0, -7, -26, -39]
我要它:
[0, (7) - (0), (19) - (7 - 0), (13) - ((19) - (7 - 0))] == [0, 7, 12, 1]`
它與operator.sub
相同,只是減法中的參數順序被交換。 或者其他方式說 - 如果operator.sub
正在執行x1-x2
我希望它在每個迭代步驟執行x2-x1
。
Everthing 是 Python 中的一個對象,可以傳遞,包括函數。 func
可以是任何可調用對象,包括 lambdas、函數、方法以及其類具有__call__
方法的任意對象。
以下是這些選項的一些示例:
lambda
是一種特殊的單表達式函數,很容易定義。 這很方便,因為您可以匿名內聯使用它:
accumulate([0, 7, 19, 13], lambda a, b: b - a)
由於一切都是對象,因此 lambda 不必是匿名的:
func = lambda a, b: b - a accumulate([0, 7, 19, 13], func)
函數可能是最普遍的可調用函數。 你用def
語句創建一個函數:
def func(a, b): return b - a accumulate([0, 7, 19, 13], func)
請注意,當您將其分配給名稱時,這看起來很像lambda
。 返回單個表達式的 Lambda 和函數在大多數方面的行為幾乎完全相同。
您也可以使用內置函數:
accumulate([0, 7, 19, 13], operator.rsub)
甚至大多數類方法都作為類對象中的函數存在。 如果你有一個統一的列表,例如,所有的int
s,你可以利用這個:
accumulate([0, 7, 19, 13], int.__rsub__)
這是有效的,因為int.__rsub__
是一個接受兩個參數的函數,它位於類int
。 當你執行(3).__rsub__(4)
,你將該函數綁定到一個實例,這將它變成一個只有一個顯式參數的方法。
一種更深奧的可調用類型是具有__call__
方法的類的實例:
class Subtractor: def __call__(self, a, b): return b - a accumulate([0, 7, 19, 13], Subtractor())
注意Subtractor()
的括號。 他們創建了一個新實例,該實例是可調用的,因為該類定義了__call__
。
類函數對象的一個特例是staticmethod
和classmethod
對象。 它們不是嚴格意義上的函數,而是將函數對象包裝在一個類中。 如果您有一個實用程序類, @staticmethod
裝飾器可以應用於不依賴於類或實例狀態的函數:
class Subtractor: @staticmethod def func1(a, b): return b - a @classmethod def func2(cls, a, b): return b - a accumulate([0, 7, 19, 13], Subtractor.func1) accumulate([0, 7, 19, 13], Subtractor().func2)
func1
行為就像一個普通函數。 事實上,它根本不會綁定到一個實例:你也可以做accumulate([0, 7, 19, 13], Subtractor().func1)
。 但是, func2
必須綁定到類而不是實例。 你也可以調用accumulate([0, 7, 19, 13], Subtractor.func2)
。
創建一個帶有兩個參數的函數,返回從第二個參數中減去第一個參數的結果:
from itertools import accumulate
def my_sub(a, b):
return b - a
print(list(accumulate([0, 7, 19, 13], my_sub)))
輸出:
[0, 7, 12, 1]
或者你可以使用lambda
:
list(accumulate([0, 7, 19, 13], lambda a, b : b - a))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.