【问题标题】:Python methods that add numbers given in parenthesis [closed]添加括号中给出的数字的Python方法[关闭]
【发布时间】:2016-11-14 14:38:54
【问题描述】:

函数应该像 add(5)(10)(20) 并且答案应该是 35

即一个应该能够提供任意数量的括号。在python中

喜欢它应该适用于任意数量的括号。

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    我找到了一种方法来满足您的要求:

    class AddableInt(int):
        def __call__(self, n):
            return AddableInt(self + n)
    
    def add(n):
        return AddableInt(n)
    
    add(5)(10)(20) # evaluates to 35
    

    这是可行的,因为对add(5) 的调用创建了一个值为5 的AddableInt。在AddableInt 中没有声明__init__ 方法,所以它只使用int 的默认构造函数。随后的调用(10)(20) 每次调用AddableInt__call__ 方法,该方法将参数添加到自身并创建一个新的AddableInt

    旧答案:

    Python 不支持您的要求。我能想到的最接近的是:

    from functools import partial
    def add(n=None, terms=None):
        if n is None:
            return sum(terms) if terms else 0
        else:
            if terms:
                terms.append(n)
            else:
                terms = [n]
            return partial(add, terms=terms)
    

    这样称呼:

    add(5)(10)(20)() # Note the extra parenthesis on the end
    

    最好使用:

    sum((5,10,20))
    

    【讨论】:

    • 它工作正常。但是是否可以跳过最后的额外括号?
    • @WasifAle:不。使这项工作的唯一方法是让对函数的每次调用都返回一个可调用函数,除非到达某个哨兵。我给哨兵打了一个空电话。一个严肃的问题,你到底为什么想要这个?这是非常不合时宜的。我想不出在任何情况下这都是调用函数的有利方式。为什么比起其他调用函数的方式更喜欢这种方式?
    • 谢谢你,史蒂文,实际上这是一个作为任务交给我的问题。甚至我都不知道为什么给我它,而这件事可以更容易地完成。不管怎样,谢谢你的帮助。
    • @WasifAle:见编辑。我设法做到了你所要求的。尽管如此,这个结构还是非常不符合 Python 的,我永远不会在与他人共享的代码中这样做。
    • 谢谢史蒂文。现在这正是我被要求的。
    【解决方案2】:

    在 python 中,您可以定义一个带有任意参数的函数,如下所示:

    def add(*args):
        total=0
        for num  in args:
            total+=num
            #or whatever you want to do with the numbers
        return total
    

    * 告诉代码从这里到结尾的所有参数都是可选的,并且可能不止一个。它将所有额外的参数存储在一个元组中。因此,如果您调用 add(5, 10, 20),它将返回 35,并且会像这样存储数字:

    args=(5, 10, 20)
    

    这是一个元组。它将多个值值存储在一个值中。所以参数 args 将等于整个元组。

    This link 可能会对您有所帮助。

    【讨论】:

    • 为什么投反对票?这将返回正确的答案,并允许您使用未知数量的参数调用该函数。如果我写错了,请编辑帖子。
    • 我没有投反对票,但您的回答并未解决 OP 的要求。您正在使用函数参数,而 OP 正在询问某种函数柯里化。问题明确指出:一个应该能够提供任意括号数
    猜你喜欢
    • 1970-01-01
    • 2014-02-10
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多