用for循环实现求和,几乎是每个Python学习者遇到的第一个综合练习。它看似简单——无非是把一串数字加起来,但真正动手写的时候,不少人会卡在变量初始化、循环逻辑、range边界这些细节上。这篇文章把for循环求和的各种写法掰开揉碎讲清楚,包括最基础的1到100求和、遍历列表求和、处理用户输入求和,以及嵌套循环处理二维数据的情形,最后还会聊聊for循环和内置sum()函数各自适合的场景。

一、for循环求和的核心逻辑:累加器的使用
所有for循环求和的写法都绕不开一个核心概念——累加器。累加器本质上就是一个普通的变量,通常命名为total或者s,它在循环开始前必须被初始化为0,然后在每次循环中把当前的数值加到自己身上。很多初学者的第一份报错代码,就是忘了初始化这个变量,直接在循环体里写total = total + i,结果Python抛出NameError,提示变量未定义。
来看最经典的例子:计算1加到100的和。写法如下:
# 1. 先定义累加器,初始化为0
total = 0
# 2. 用range生成1到100的整数序列,注意range(1, 101)包含1不包含101
for i in range(1, 101):
total = total + i # 每次循环把i累加到total上
# 3. 循环结束后输出结果
print("1到100的和是:", total) # 输出 5050
这段代码有三个关键点。第一,total = 0必须写在循环之前,这叫累加器初始化,如果写成其他值(比如1),结果就错了。第二,range(1, 101)是左闭右开区间,想加到100就必须写到101,这是最容易记错的地方。第三,累加语句total = total + i也可以简写成total += i,两种写法效果完全一样,后者更符合Python的编码习惯。
理解了累加器的思路后,还可以举一反三。比如求1到100中所有偶数的和,只需要在循环体里加一个条件判断,用if i % 2 == 0筛出偶数再累加即可。或者直接让range函数按步长为2生成偶数序列:for i in range(2, 101, 2),这样循环次数减半,代码也更简洁。range函数的完整形式是range(start, stop, step),三个参数分别是起始值、终止值和步长,灵活组合它能省掉不少条件判断。
二、遍历列表、元组等序列求和
实际开发中,更多的情况是对一个已经存在的列表求和,而不是连续的整数。这时候for循环直接遍历列表元素即可,写法和range版本略有不同:
scores = [88, 92, 75, 63, 97]
total = 0
for score in scores:
total += score
print("总分:", total) # 输出 415
# 如果还想顺便算平均分,循环结束后除以列表长度
avg = total / len(scores)
print("平均分:", avg)
这里for循环直接取出列表中的每个元素,不需要通过下标访问。有些从C语言转过来的学习者习惯写下标循环,比如for i in range(len(scores)): total += scores[i],这种写法在Python里虽然能跑,但不被推荐,因为Python的for循环本身就是为遍历序列设计的,直接遍历元素更清晰也更安全,不会出现下标越界的问题。
如果既想要元素又想要下标,比如统计最高分出现的位置,可以用内置的enumerate()函数:
scores = [88, 92, 75, 63, 97]
total = 0
max_index = 0
for idx, score in enumerate(scores):
total += score
if score > scores[max_index]:
max_index = idx
print("总和:", total, "最高分下标:", max_index)
还有一种常见需求是处理用户输入的一串数字求和。用户输入通常是一个整行字符串,比如"12 34 56",需要先用split()切分成子串,再用int()逐个转换后累加:
text = input("请输入若干个数字,用空格分隔: ")
numbers = text.split() # 按空白切分成字符串列表
total = 0
for item in numbers:
total += int(item) # 记得转换成整数再累加
print("求和结果:", total)
这段代码里有个隐蔽的坑:如果用户输入了非数字内容,int(item)会抛出ValueError。健壮的写法应该配合try...except捕获异常,或者用str.isdigit()先判断再转换,这个细节在写实际项目时尤其重要。
三、嵌套for循环求二维数据的总和
当数据从一维扩展到二维,比如一个班级多个小组的成绩表,就需要嵌套循环。外层循环遍历每一行(每个小组),内层循环遍历行内的每个元素(每个人的成绩):
grades = [
[85, 90, 78], # 第一小组
[92, 66, 88], # 第二小组
[70, 95, 83] # 第三小组
]
total = 0
for row in grades: # 外层循环:取出每一行
for score in row: # 内层循环:取出行内每个成绩
total += score
print("全班总分:", total) # 输出 747
嵌套循环求和的关键在于累加器total的位置。它必须定义在两层循环之外,这样才是全局累加。如果把total = 0写到了外层循环里面,每次处理新的一行时累加器都会被重置,最终得到的结果只有最后一行的和。这是初学者在处理二维数据时最典型的错误之一,排查起来也不容易,因为代码不报错,只是结果不对。
如果需求是分别统计每个小组的小计,那么就需要在循环内维护多个累加变量,或者在循环结束后把每一行单独求和:
grades = [
[85, 90, 78],
[92, 66, 88],
[70, 95, 83]
]
for i, row in enumerate(grades, start=1):
subtotal = 0 # 每组单独的累加器,放在外层循环内
for score in row:
subtotal += score
print(f"第{i}小组总分: {subtotal}, 平均分: {subtotal / len(row):.1f}")
这段代码同时演示了enumerate()的start参数,它让编号从1开始,输出更符合日常习惯。可以看到,累加器放在不同的层级,语义完全不同:放在最外层是全局总和,放在外层循环体内是分组小计,放在内层循环体内则每次都会被重置(通常就是bug了)。
四、for循环求和与内置sum函数的对比
Python其实提供了内置的sum()函数,一行代码就能完成求和:sum(range(1, 101))或者sum(scores)。既然如此,还有必要学for循环求和吗?答案是肯定的,两者各有适用场景。
首先,sum()函数只适用于可迭代对象中的元素本身支持加法的情况。如果想求和的同时附加条件,比如只统计大于80分的成绩,用sum()虽然也能配合生成器表达式实现,比如sum(x for x in scores if x > 80),但对于刚入门的学习者来说,for循环的写法逻辑更直观,更容易理解程序到底在做什么。
其次,从练习的角度看,for循环求和训练的是累加器这个通用编程思维,几乎所有语言都有这个模式,掌握了它再学while循环、递归求和都会顺理成章。而在性能敏感的场景下,内置sum()由C语言实现,遍历大列表时通常比手写for循环快,比如对一个包含一百万个整数的列表求和,sum()往往只需要手写循环一半左右的时间。所以实际项目里对简单求和直接用sum(),涉及复杂逻辑时再写for循环,是比较合理的选择。
最后补充几个for循环求和的常见错误:一是累加语句写成了total = i,变成了赋值而不是累加,最终结果等于最后一个元素;二是累加语句没有缩进到循环体内,导致循环空转,只在结束后加了一次;三是遍历字符串列表时忘了转换类型,导致字符串拼接而不是数字相加,比如"1" + "2"得到"12"。写完求和代码后,拿一组小数据手动验算一遍,是避免这些低级错误最有效的办法。
python for循环python求和range函数修改时间:2026-09-07 11:23:17