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

如何解决如何在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__方法的任意对象。

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

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

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

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

     func = lambda a,b: b - a
     accumulate([0,func)
    
  2. 函数可能是最普遍使用的可调用函数。您可以使用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)时,便将该函数绑定到一个实例,该实例将其转换为仅带有一个显式参数的方法。

  3. 更深奥的callable类型是具有__call__方法的类的实例:

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

    请注意Subtractor()中的括号。他们创建了一个新实例,该实例是可调用的,因为该类定义了__call__

  4. 类似于函数的对象的特殊情况是staticmethodclassmethod对象。它们不是严格的函数,而是将函数对象包装在类中。如果您有实用程序类,则可以将@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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?