最近学到了Pyhton中循环这一章。之前也断断续续学过,但都只是到了函数这一章就停下来了,写过的代码虽然保存了下来,但是当时的思路和总结都没有记录下来,很可惜。这次我开通了博客,就是要把这些珍贵的学习思考总结记录下来。从现在开始。
关于这一章始终有几个难点不懂。第一个就是每次循环过后,其中的累加变量是否要清零?这个问题困扰了我许久。很多次写完代码运行时发现,计算结果和我想要的结果根本不同。比如在《Python语言程序设计》这本书里,第5章习题第27题:
计算π的值:π =4 * (1 - 1/3 + 1/5 - 1/7 + 1/9 + … + (-1)i+1 / (2*i -1)),显示当i=10000, 20000, ,,100000时π的值
题目不难,按公式写就行了。由于希望显示i在1万、2万,,时,π的值,所以用了两层for循环。最开始的代码如下:
# 累加变量
sum = 0
for i in range(10000, 100001, 10000):
print('i =', i, '时,π的值为:', end = '')
for j in range(1, i+1):
sum += ((-1) ** (j + 1)) / (2 * j - 1)
pi = 4 * sum
print(pi)
运行结果如下:
i = 10000 时,π的值为:3.1414926535900345
i = 20000 时,π的值为:6.283035307179826
i = 30000 时,π的值为:9.42459462743631
i = 40000 时,π的值为:12.566162281026036
i = 50000 时,π的值为:15.707734934615797
i = 60000 时,π的值为:18.849310921538994
i = 70000 时,π的值为:21.990889289414817
i = 80000 时,π的值为:25.13246944300482
i = 90000 时,π的值为:28.27405098548388
i = 100000 时,π的值为:31.415633639074002
很明显,这个结果是错的。只有第一个结果是计算正确的。开始我百思不得其解,我的循环变量感觉没问题啊,循环步长也没错,计算公式也没错啊。怎么会这样?我想了想,第一个结果正确,但是从第二个结果就开始错,那问题就出在循环上面。当第一次计算结束时,此时sum 已经不再是0,而是有了一个值,由于sum定义在循环外部,所以下一次循环时,sum将带着第一次循环后的值进入下一次计算,相当于每循环一次,sum的值都在增加。相应的,π的值也在增加,这也就解释了为什么π的值越算越大。所以我将代码修改如下,就是进行了一步微调:将sum的定义移到第一层for循环的内部,i每循环一次,sum都要清零!!!
修改后的代码如下:
for i in range(10000, 100001, 10000):
print('i =', i, '时,π的值为:', end = '')
# 下面这句非常重要,每次计算完后累加变量要清零!
sum = 0
for j in range(i + 1, 0, -1):
sum += ((-1) ** (j + 1)) / (2 * j - 1)
pi = 4 * sum
print(pi)
运行结果如下:
i = 10000 时,π的值为:3.1414926535900345
i = 20000 时,π的值为:3.1415426535898248
i = 30000 时,π的值为:3.141559320256462
i = 40000 时,π的值为:3.1415676535897985
i = 50000 时,π的值为:3.1415726535897814
i = 60000 时,π的值为:3.141575986923102
i = 70000 时,π的值为:3.141578367875482
i = 80000 时,π的值为:3.1415801535897496
i = 90000 时,π的值为:3.1415815424786238
i = 100000 时,π的值为:3.1415826535897198
这样才对嘛!随着 i 的增大,计算结果只能是在小范围内波动。
总结:循环变量是否要清零要看情况而定,但如果希望每次循环时,累加变量能以一个全新的值进入下一次循环那就要清零了。像这样喜欢在代码前面定义变量并赋初值的习惯,是写C留下的。但遇到循环时要小心,变量的作用域会在不知不觉间让你犯错。