簡體   English   中英

如何在 itertools.accumulate 中定義自己的 func 參數?

[英]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__方法的任意對象。

以下是這些選項的一些示例:

  1. lambda是一種特殊的單表達式函數,很容易定義。 這很方便,因為您可以匿名內聯使用它:

     accumulate([0, 7, 19, 13], lambda a, b: b - a)

    由於一切都是對象,因此 lambda 不必是匿名的:

     func = lambda a, b: b - a accumulate([0, 7, 19, 13], func)
  2. 函數可能是最普遍的可調用函數。 你用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) ,你將該函數綁定到一個實例,這將它變成一個只有一個顯式參數的方法。

  3. 一種更深奧的可調用類型是具有__call__方法的類的實例:

     class Subtractor: def __call__(self, a, b): return b - a accumulate([0, 7, 19, 13], Subtractor())

    注意Subtractor()的括號。 他們創建了一個新實例,該實例是可調用的,因為該類定義了__call__

  4. 類函數對象的一個​​特例是staticmethodclassmethod對象。 它們不是嚴格意義上的函數,而是將函數對象包裝在一個類中。 如果您有一個實用程序類, @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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM