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
创建一个具有两个参数的函数,该函数返回第一个参数减去第二个参数的结果:
输出:
或者您可以使用
lambda
:在python中,Everything是一个对象,可以传递,包括函数
func
可以是任何可调用的,包括lambda、函数、方法和类具有__call__
方法的任意对象以下是这些选项的一些示例:
A
lambda
是一个非常容易定义的特殊单表达式函数。它很方便,因为您可以匿名内联使用它:因为一切都是一个对象,所以lambda不必是匿名的:
函数可能是最普遍的可调用函数。使用
def
语句生成函数:注意,当您将它分配给一个名称时,它看起来非常像
lambda
。lambda和返回单个表达式的函数在大多数方面的行为几乎完全相同您也可以使用内置功能:
甚至大多数类方法也作为函数存在于类对象中。如果您有一个统一的列表,例如,所有
int
,您可以利用这一点:这是因为
int.__rsub__
是一个接受两个参数的函数,它位于类int
中。当您执行(3).__rsub__(4)
时,您将该函数绑定到一个实例,从而将其转换为只包含一个显式参数的方法更深奥的可调用类型是具有
__call__
方法的类的实例:注意
Subtractor()
中的括号。它们创建一个新实例,该实例是可调用的,因为类定义了__call__
类函数对象的一种特殊情况是
staticmethod
和classmethod
对象。它们不是严格意义上的函数,而是将函数对象包装在类中。如果您有实用程序类,@staticmethod
装饰器可以应用于不依赖于类或实例状态的函数:func1
的行为类似于正常函数。事实上,它根本不会绑定到实例:您还可以执行accumulate([0, 7, 19, 13], Subtractor().func1)
^但是,{accumulate([0, 7, 19, 13], Subtractor.func2)
相关问题 更多 >
编程相关推荐