如何在python中实现像sum(2)(3)(4)......(n)这样的函数?

use*_*400 -1 python functional-programming higher-order-functions

如何实现一个将sum_numbers(2)(3)(4)......(n) 在python 中以下列方式调用的函数?

结果应该是 2+3+4+.....+n

我的提示是因为函数是pythons中的对象,有可能使用嵌套函数来做那些但我不确定.

def sum_number(x):
    def sum_number_2(y):
        def sum_number_3(z):
        ....................
            def sum_number_n(n)
                return n
            return sum_number_n
        return sum_number_3
    return sum_number_2
  return sum_number
Run Code Online (Sandbox Code Playgroud)

但是,不是编写这么多嵌套函数,我们应该能够在几个嵌套函数中执行它,以便在以下列方式调用时计算n个值的总和 sum_numbers(2)(3)(4)......(n)

Ign*_*ams 5

使用Python的数据模型功能将结果转换为所需的类型.

class sum_number(object):
  def __init__(self, val):
    self.val = val

  def __call__(self, val):
    self.val += val
    return self

  def __float__(self):
    return float(self.val)

  def __int__(self):
    return int(self.val)

print '{}'.format(int(sum_number(2)(3)(8)))
print '{}'.format(float(sum_number(2)(3)(8)))
Run Code Online (Sandbox Code Playgroud)


pok*_*oke 5

您可以创建一个int可调用的子类:

class sum_numbers (int):
    def __new__ (cls, *args, **kwargs):
        return super().__new__(cls, *args, **kwargs)

    def __call__ (self, val):
        return sum_numbers(self + val)
Run Code Online (Sandbox Code Playgroud)

这样,您就可以与普通整数完全兼容(因为该类型的对象普通整数),因此以下示例有效:

>>> sum_numbers(2)(3)(4)(5)
14
>>> isinstance(sum_numbers(2)(3), int)
True
>>> sum_numbers(2)(3) + 4
9
Run Code Online (Sandbox Code Playgroud)

当然,您可能想要重写其他方法,例如__add__,添加普通整数仍将返回您类型的对象。否则,您必须使用结果调用类型,例如:

>>> sum_numbers(sum_numbers(2)(3) + 5)(6)
16
Run Code Online (Sandbox Code Playgroud)