python求和函数-`start`需要参数解释
我试图理解内置的python求和函数-`start`需要参数解释,python,sum,Python,Sum,我试图理解内置的sum()函数的工作原理,但是start参数已经让我忘记了: a=[[1,20],[2,3]] b=[1,2,3,4,5,6] >>>总数(b,a) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:只能将列表(而不是“int”)连接到列表 >>>总数(a、b) [[[[[[1], 2], 3], 4], 5], 6, 1, 20, 2, 3] >a=[1,2] >>>b=[3,4] >>>总数(a、b) 回溯(最近一次呼叫最后一次): 文件“”,第1行
sum()
函数的工作原理,但是start
参数已经让我忘记了:
a=[[1,20],[2,3]]
b=[1,2,3,4,5,6]
>>>总数(b,a)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:只能将列表(而不是“int”)连接到列表
>>>总数(a、b)
[[[[[[1], 2], 3], 4], 5], 6, 1, 20, 2, 3]
>a=[1,2]
>>>b=[3,4]
>>>总数(a、b)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:只能将列表(而不是“int”)连接到列表
>>>总数(b,a)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:只能将列表(而不是“int”)连接到列表
a=[[1, 20], [2, 3]]
b=[[[[[[1], 2], 3], 4], 5], 6]
sum(b, a)
此错误与start参数无关。列表中有两项b
。其中一个是[1],2],3],4],5]
,另一个是6
,列表和int不能一起添加
sum(a, b)
这是补充:
[[[[[[1], 2], 3], 4], 5], 6] + [1, 20] + [2, 3]
这很好(因为您只是将列表添加到列表中)
这正试图添加[3,4]+1+2
,这同样是不可能的。类似地,sum(b,a)
正在添加[1,2]+3+4
如果开始不是字符串,也不是整数,该怎么办
sum
无法对字符串求和。见:
>>> sum(["a", "b"], "c")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: sum() can't sum strings [use ''.join(seq) instead]
总和([“a”、“b”]、“c”)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:sum()无法对字符串求和[改用''连接(seq)]
Sum做了类似的事情
def sum(values, start = 0):
total = start
for value in values:
total = total + value
return total
sum([1,2],[3,4])
扩展类似于[3,4]+1+2
,您可以看到它尝试将数字和列表添加到一起
sum(a, b)
为了使用sum
生成列表,值应该是列表列表,而start可以只是列表。在失败的示例中,您将看到列表至少包含一些int,而不是所有列表
通常情况下,您可能会考虑使用列表求和,将列表列表转换为列表
sum([[1,2],[3,4]], []) == [1,2,3,4]
但是你真的不应该这样做,因为这样做会很慢。其他答案中已经暗示但没有明确说明的一点是,start值定义了返回值和被求和项的
类型。因为默认值是start=0
,(当然,0是一个整数),所以iterable中的所有项都必须是整数(或者使用处理整数的\uuuuuuuuuu添加\uuuuu
方法的类型)。其他示例提到了串联列表:
(sum([[1,2],[3,4],[])==1,2,3,4]
)
或timedate.timedelta
对象:
(sum([timedelta(1),timedelta(2)],timedelta())==timedelta(3)
)
请注意,这两个示例都将iterable中类型的空对象作为开始参数传递,以避免获得类型错误:不支持+:“int”和“list”的操作数类型错误。我只是想澄清一些混淆。
求和函数的签名应该是:
sum(iterable,start=0)
而不是
sum(values,start=0)
如上所述。这一更改将使签名更清晰
全功能:
def sum(iterable,start=0):
total=start
for val in iterable:
total+=val
return total
我仅对累积和使用start
参数,因此类型仅为int
。我不认为它适用于这种病理情况:)如文件所示:限制sum
为数字:-)你会有更少的头痛。如果您必须串联嵌套列表,请进行一些显式构造-无论如何,您将拥有更多可维护的代码。更像是total=total+value
,这就是sum具有二次性能的原因lists@gnibbler是的。我没有想过。这似乎是一个评论/编辑建议,而不是一个单独的答案。请注意,sum
builtin不接受关键字参数;参数的名称是无关紧要的。实际上,我试图解释内置的求和函数在实践中是如何工作的。
sum(values,start=0)
def sum(iterable,start=0):
total=start
for val in iterable:
total+=val
return total