如何在itertools.accumulate中定义自己的func参数?

2024-10-02 02:34:48 发布

您现在位置:Python中文网/ 问答频道 /正文

itertools.acculate的用法如下:

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


Tags: none用法参数定义运算符iterableoperatorlist
2条回答

创建一个具有两个参数的函数,该函数返回第一个参数减去第二个参数的结果:

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))

在python中,Everything是一个对象,可以传递,包括函数func可以是任何可调用的,包括lambda、函数、方法和类具有__call__方法的任意对象

以下是这些选项的一些示例:

  1. Alambda是一个非常容易定义的特殊单表达式函数。它很方便,因为您可以匿名内联使用它:

     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,您可以利用这一点:

     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)^但是,{}必须绑定到类而不是实例。您也可以调用accumulate([0, 7, 19, 13], Subtractor.func2)

相关问题 更多 >

    热门问题