Python使用For循环求1-100正偶数与负奇数和的结果异常问题
问题排查:代码结果与预期不符的原因分析
让我们先理清楚核心矛盾:你的代码逻辑和你预期的计算规则不一致,导致结果差了2。
1. 拆解代码的实际计算逻辑
你的代码里:
lst = range(1,101) total = 0 for x in lst: if x % 2: # 奇数的x%2结果是1(布尔值True),偶数是0(布尔值False) total -= x else: total += x
这段代码的规则是:所有奇数都做减法,所有偶数都做加法,对应的计算式是:
-1 + 2 - 3 + 4 - 5 + 6 - ... - 99 + 100
我们可以把每两个数分组计算:
(-1+2) + (-3+4) + ... + (-99+100)
一共50组,每组结果都是1,所以总结果是50*1=50,这和代码运行结果一致,说明代码本身逻辑是自洽的。
2. 分析你预期的计算式
你给出的预期计算式是 1+2-3+4+…+98-99+100,按这个规则计算的话,我们调整分组方式:
把第一个数1单独拿出来,剩下的从2到99每两个数分组:
1 + (2-3) + (4-5) + ... + (98-99) + 100
这里从2到99一共98个数,分成49组,每组结果是-1,所以:
1 + (49*(-1)) + 100 = 1 -49 +100 = 52,这就是你预期的结果。
3. 找到核心差异点
两者的核心差异在于第一个奇数1的处理:
- 代码逻辑:所有奇数都减 → 1被减去了(-1)
- 预期逻辑:第一个奇数1要加,其他奇数才减 → 1被加上了(+1)
一减一加之间,差值是2,所以代码结果50 + 2 = 52,正好是预期结果。
4. 修正代码的两种方案
如果你想实现预期的计算规则(1加,其他奇数减,所有偶数加),可以用两种方式修改:
方案一:单独处理第一个数,再循环剩下的数
total = 1 # 先把第一个数1加进去 for x in range(2, 101): if x % 2: total -= x else: total += x print(total) # 输出52
方案二:在循环里判断是否是第一个奇数
total = 0 for x in range(1, 101): if x % 2: if x == 1: total += x # 第一个奇数加 else: total -= x # 其他奇数减 else: total += x # 所有偶数加 print(total) # 输出52
另外,如果你其实是想实现“正偶数与负奇数的累加和”(即所有奇数都负,所有偶数都正),那你的代码是正确的,这时候预期结果应该是50,可能是你对计算式的理解有误哦。
内容的提问来源于stack exchange,提问作者Alex Walter
相关产品推荐
相关产品推荐

