这是一个代码大战挑战,您必须返回给定参数的总和。
说明:
计算传递给函数的所有参数的总和。
注意:如果任何参数不是有限数,则函数应该返回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
答案 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))