2016-02-20 58 views
1

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

说明:

Calculate the sum of all the arguments passed to a function.

Note: If any of the arguments is not a finite number the function should return false/False instead of the sum of the arguments.

这里是我的代码:

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 

回答

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 
+0

在'Test.assert_equals(sum_all。。 (76856,-32,1981,1076),79881)',我得到的错误:'假应等于79881' –

+0

哦,你只要让我意识到这是如何简化更新 – idjaw

+0

这工作,但你可以简单。!向我解释为什么这个解决方案的作品相比,旧的解决方案? –

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 

问题中的行号是误导性的,存在两个问题:首先,您需要迭代的变量。其次,您需要一个变量来分配+=。在这两种情况下,您都会尝试应用一个演员阵列,结果导致该阵列不再是变量,因此不能用作任务的目标。

+0

我仍然得到同样的错误 –

+0

固定。问题中的行号与代码snipplet不匹配... – flaschbier

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 
+0

这是为什么downvoted ??? – idjaw

+0

不知道....也许是因为我编辑之前发布的解释。你可以投上一票( - ; – Alexander

+0

“4”是一个数字,但你不能加“4”为整数 – Makoto

2

你正在推翻这一点。有两个部分来此要注意:

  • sum是,已经采取集合中,让您的总和的函数。
  • 要拒绝收集,如果他们都不是数字类型。

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

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

这不是你如何检查Python中的类型。使用'isinstance(I,(整数,浮点))' – Alexander

+0

@Alexander:感谢您的提示,我已经纠正它。不过,我认为增加浮点数应该留给读者。 ;) – Makoto

-1

同样最小改变了代码:

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

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

您会注意到,此回复与其他两位已回复的回复相同。 – Alexander

+0

这与一个答案完全相同。刚刚检查。看起来好像伟大的思想家一样。 – Berni

+0

这是相同的我随着编辑让我@idjaw在大约相同的时间响应的第二部分。你应该删除你的答案,因为它不会在讨论中添加任何新内容,而只是复制其他人已经提供的内容。 – Alexander