如何从用户获取任意数量的括号来添加功能

时间:2016-07-22 07:43:20

标签: python

add(5)(10)(20)

如何提供任意数量的括号来添加数字?

3 个答案:

答案 0 :(得分:3)

你可以像这样创建一个类:

class add(object):
    def __init__(self, value):
        self.value= value

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

    def __repr__(self):
        return str(self.value)


print add(5)(10)(20)
# output: 35

答案 1 :(得分:2)

这是不可能的,或者至少它应该,如果您使用的语言是值得的。你要求函数返回两种不同的类型,这会引发一场灾难。

  1. 有时候它应该返回一个函数,它接受下一个要添加的数字
  2. 其他时候它应该返回先前输入的总和。
  3. 什么?退后一步,问问自己是什么样的设计。您需要某种方式来通知函数您已完成输入,现在您需要计算值。

    考虑一下,该功能可能看起来像这样

    def add (sum):
      print(sum)
      return lambda x: add(sum + x)
    
    add(1)(3)(4)(5)(10)(20)
    
    # 1
    # 4
    # 8
    # 13
    # 23
    # 43
    # => None
    

    但除非你以某种方式更改api,否则无法让函数知道返回最终值。

    当用户输入0或其他内容时,您可以更改api以返回计算值。好主意对吗?非常聪明。

    def add (x):
      def loop(sum, x):
        if x == 0:
          return sum
        else:
          return lambda x: loop(sum + x, x)
      return loop(0, x)
    
    print(add(1)(3)(4)(5)(10)(20)(0))
    # 42
    
    嘿,看起来,它适用于@Rawling的聪明代码失败的地方。所有这些都没有在课堂上添加一些技巧

    print(add(5)(10)(20)(0) + add(5)(10)(20)(0)) 
    # 70
    

    但是,这仍然是垃圾代码。没有精心设计的功能应该像这样。

    或者如果您的内容是疯了,请创建一个类似@Rawing的答案建议。

答案 2 :(得分:-1)

你能做的是:

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

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

add(5)(10)()
>>> 15