如何解决如何在itertools.accumulate中定义自己的func参数?
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,-39]
如下:
[0,(0) - (7),(0 - 7) - (19),((0 - 7) - (19)) - (13)] == [0,-39]
我想要它:
[0,(7) - (0),(19) - (7 - 0),(13) - ((19) - (7 - 0))] == [0,12,1]`
与operator.sub
相同,只是减法内的参数顺序被交换。或以其他方式说-如果operator.sub
在做x1-x2
,我希望它在每个迭代步骤中都在做x2-x1
。
解决方法
一切都是python中的对象,并且可以传递,包括函数。 func
可以是任何可调用的,包括lambda,函数,方法和其类具有__call__
方法的任意对象。
以下是这些选项的一些示例:
-
lambda
是一种特殊的单表达式函数,非常易于定义。这很方便,因为您可以匿名内联使用它:accumulate([0,7,19,13],lambda a,b: b - a)
由于一切都是对象,因此lambda不必是匿名的:
func = lambda a,b: b - a accumulate([0,func)
-
函数可能是最普遍使用的可调用函数。您可以使用
def
语句来创建函数:def func(a,b): return b - a accumulate([0,func)
请注意,将其分配给名称时,它看起来很像
lambda
。返回单个表达式的Lambda和函数在大多数方面的行为几乎完全相同。您还可以使用内置函数:
accumulate([0,operator.rsub)
即使大多数类方法都作为函数存在于类对象中。如果您有一个统一的列表,例如所有
int
,则可以利用此优势:accumulate([0,int.__rsub__)
之所以可行,是因为
int.__rsub__
是一个接受两个参数的函数,该函数位于类int
中。当您执行(3).__rsub__(4)
时,便将该函数绑定到一个实例,该实例将其转换为仅带有一个显式参数的方法。 -
更深奥的callable类型是具有
__call__
方法的类的实例:class Subtractor: def __call__(self,a,b): return b - a accumulate([0,Subtractor())
请注意
Subtractor()
中的括号。他们创建了一个新实例,该实例是可调用的,因为该类定义了__call__
。 -
类似于函数的对象的特殊情况是
staticmethod
和classmethod
对象。它们不是严格的函数,而是将函数对象包装在类中。如果您有实用程序类,则可以将@staticmethod
装饰器应用于不依赖于类或实例状态的函数:class Subtractor: @staticmethod def func1(a,b): return b - a @classmethod def func2(cls,b): return b - a accumulate([0,Subtractor.func1) accumulate([0,Subtractor().func2)
func1
的行为类似于普通功能。实际上,它根本不会绑定到实例:您也可以执行accumulate([0,Subtractor().func1)
。但是,func2
必须绑定,但必须绑定到类而不是实例。您也可以拨打accumulate([0,Subtractor.func2)
。
创建具有两个参数的函数,该函数返回从第二个参数减去第一个参数的结果:
from itertools import accumulate
def my_sub(a,b):
return b - a
print(list(accumulate([0,my_sub)))
输出:
[0,12,1]
或者您可以使用lambda
:
list(accumulate([0,b : b - a))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。