Python使用sum函数报错'int'对象不可迭代及简化求和写法咨询
问题1:两个sum值相加报错的解决方案
你当前触发TypeError: 'int' object is not iterable报错的原因是Python内置sum()函数的第一个入参要求为可迭代对象(列表、元组、生成器等),第二个可选参数是求和起始值。你传入两个整数作为参数,第一个参数sum_A是整数不满足可迭代要求,因此报错。
两种修复方式都可以得到预期的10:
- 直接对两个整数做加法:
SumA_B = sum_A + sum_B - 若坚持用
sum()函数,可把两个整数放入列表后传入:SumA_B = sum([sum_A, sum_B])
问题2:直接调用sum(count_A)不报错的简化写法
cursor.fetchall()在单字段查询时返回的结果是[(值,), (值,)]格式的元组列表,直接求和会触发整数与元组无法相加的错误,你可以用两种更简便的方案替代遍历取row[0]的写法:
- SQL层直接聚合(更推荐,性能更高)
直接在查询语句中完成求和,不需要Python侧额外处理:
# ELEMENT 1 优化写法 cursor.execute('SELECT sum(City) FROM Nation WHERE X = ?', [X]) sum_A = cursor.fetchone()[0] # 直接得到求和结果5 # ELEMENT 2 优化写法 cursor.execute('SELECT sum(City) FROM Nation WHERE Y = ?', [Y]) sum_B = cursor.fetchone()[0] # 直接得到求和结果5
- Python层解包转换
如果不想修改SQL逻辑,可以通过解包操作把元组列表转为可直接求和的序列:
count_A = cursor.fetchall() # 结果仍为[(2,), (1,), (2,)] sum_A = sum(*zip(*count_A)) # 直接得到5,不需要遍历取row[0]
原理是zip(*count_A)会把所有元组的第一个字段提取出来打包成新的元组,解包后传入sum()即可直接得到求和结果。
内容的提问来源于stack exchange,提问作者user17548905
相关产品推荐
相关产品推荐

