所有论点的总和

时间:2016-02-20 21:06:37

标签: python python-2.7

这是一个代码大战挑战,您必须返回给定参数的总和。

说明:

  

计算传递给函数的所有参数的总和。

     

注意:如果任何参数不是有限数,则函数应该返回false / False而不是参数的总和。

这是我的代码:

def sum_all(*args):
    sum = 0

    for str(num) in args:
        if not num.isdigit():
            return False
        else:
            int(sum) += num
    return sum

目前我收到此错误:

File "", line 9
SyntaxError: can't assign to function call

5 个答案:

答案 0 :(得分:3)

首先,不要覆盖sum等现有功能。使用其他变量名称(例如sum_)。其次,您的问题出在for str(num) in args行。这需要for num in args:,并修改str(num)的以下行。

def sum_all(*args):
    sum_ = 0

    for num in args:
        if not str(num).isdigit():
            return False
        else:
            sum_ += float(num)
    return sum_

>>> sum_all('a', 2)
False

>>> sum_all(1, 2)
3.0

>>> sum_all(1, 2, '4')
7.0

这是一种编码函数的替代方法,该函数使用生成器理解来尝试对参数求和,但如果失败则返回False:

def sum_all2(*args):
    try:
        return sum(i for i in args)
    except:
        return False

>>> sum_all2(1, 2, '4.5')
False

>>> sum_all2(1, 2, '4')  # I argue that '4' is a string, not a finite number.
False

>>> sum_all2(1, 2)
3

>>> sum_all2(1, 2, 3.5)
6.5

>>> sum_all2(1, 2, -3.5)
-0.5

答案 1 :(得分:3)

该错误消息实际上发生在两个地方:

下面:

for str(num) in args:

在这里:

int(sum) += num

您无法按照您尝试的方式转换为字符串和int。

你要做的是将迭代保持为:

for num in args:

然后,您可以通过执行以下操作来检查数字:

    if not str(num).isdigit():

最后,当你总结所有内容时,只需将num转换为int(num)来处理案例,如果你传递[1, 2, '3', 4]之类的东西(不是3作为字符串):

sum += num

因此,考虑到这一点,您的代码将如下所示:

def sum_all(*args):
    sum = 0

    for num in args:
        if not str(num).isdigit():
            return False
        else:
            sum += int(num)
    return sum

但是,正如您在评论中指出的那样,有一个负数的测试用例。这是上述代码中断的地方。因为,负数作为字符串:

"-343"

不要通过isdigit

如果您将其放入口译员,它将返回False

"-343".isdigit()

因此,考虑到这一切,您可以在删除代码时实际上进一步简化代码:

def sum_all(*args):
    try:
        return sum(int(i) for i in args)
    except:
        return False

演示:

print(sum_all(1,2,3,4,5))

输出:

15

答案 2 :(得分:2)

你正在过度思考这个问题。这有两个部分需要注意:

  • sum是一个已经收集集合的函数,并为其提供总和。
  • 如果它们都不是数字类型,您想要拒绝该集合。

这是一个开始:如果没有值int,则此特定方法将拒绝。我将此扩展到float类型,作为读者的练习。

def sum_or_reject(li):
    return sum(li) if all([isinstance(i, int) for i in li]) else False

答案 3 :(得分:0)

使逻辑运行的最小变化是:

def sum_all(*args):
    sum = 0

    for s in args:
        num = str(s)
        if not num.isdigit():
            return False
        else:
            sum += int(num)
    return sum

问题中的行号具有误导性,有两个问题:首先,您需要一个变量用于迭代。其次,您需要+=赋值的变量。在这两种情况下,您都尝试应用强制转换,但是结果将不再是变量,因此不能用作赋值的目标。

答案 4 :(得分:-1)

同样是对代码的最小更改:

def sum_all(*args):
    try:
        return sum(int(i) for i in args)
    except:
        return False

print(sum_all(10,'-1',10))