最近学到了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留下的。但遇到循环时要小心,变量的作用域会在不知不觉间让你犯错。

Python语言程序设计之一--for循环中累加变量是否要清零的更多相关文章

  1. Python语言程序设计之三--列表List常见操作和错误总结

    最近在学习列表,在这里卡住了很久,主要是课后习题太多,而且难度也不小.像我看的这本<Python语言程序设计>--梁勇著,列表和多维列表两章课后习题就有93道之多.我的天!但是题目出的非常 ...

  2. Python语言程序设计之二--用turtle库画围棋棋盘和正、余弦函数图形

    这篇笔记依然是在做<Python语言程序设计>第5章循环的习题.其中有两类问题需要记录下来. 第一是如何画围棋棋盘.围棋棋盘共有19纵19横.其中,位于(0,0)的星位叫天元,其余8个星位 ...

  3. 【任务】Python语言程序设计.MOOC学习

    [博客导航] [Python导航] 任务 18年11月29日开始,通过9周时间跨度,投入约50小时时间,在19年1月25日之前,完成中国大学MOOC平台上的<Python语言程序设计>课程 ...

  4. 全国计算机等级考试二级Python语言程序设计考试大纲

    全国计算机等级考试二级Python语言程序设计考试大纲(2018年版) 基本要求 掌握Python语言的基本语法规则. 掌握不少于2个基本的Python标准库. 掌握不少于2个Python第三方库,掌 ...

  5. Python语言程序设计(1)--实例1和基本知识点

    记录慕课大学课程<Python语言程序设计>的学习历程. 实例1:温度转换 #温度转换TempStr = input("请输入带有符号的温度值:") #TempStr是 ...

  6. 【SQL】小心在循环中声明变量——浅析SQL变量作用域

    本文适用:T-SQL(SQL Server) 先看这个语句: --跑3圈 BEGIN --每圈都定义一个表变量,并插入一行 DECLARE @t TABLE(Col INT PRIMARY KEY) ...

  7. js for 循环中的 变量问题。

    今日处理项目中的一个循环,本来就是一个小小的for循环,后来发现该段程序出现了问题,仔细检查代码没有发现其中的错误.无奈只好叫来了老大帮忙.通过在模版中断点调试(该方式只能自己写debugger断点) ...

  8. 《python语言程序设计》_第5章_循环

    #5.1_引言 程序1: 结果: 程序2: 结果: sum is 45 ##注意整个循环语句都要内缩进循环内部 ##ctrl+c中止一个无限循环运行 程序清单5-1: 结果: #5.2.1_实例研究: ...

  9. 【学习笔记】PYTHON语言程序设计(北理工 嵩天)

    1 Python基本语法元素 1.1 程序设计基本方法 计算机发展历史上最重要的预测法则     摩尔定律:单位面积集成电路上可容纳晶体管数量约2年翻倍 cpu/gpu.内存.硬盘.电子产品价格等都遵 ...

随机推荐

  1. AtCoder Regular Contest 082 ABCD

    A #include<bits/stdc++.h> using namespace std; ]; int n,m; int main(){ cin>>n>>m; ...

  2. 2017ACM/ICPC广西邀请赛 Duizi and Shunzi

    题意:就是一个集合分开,有两种区分 对子:两个相同数字,顺子:连续三个不同数字,问最多分多少个 解法:贪心,如果当前数字不构成顺子就取对子 /2,如果可以取顺子,那么先取顺子再取对子 #include ...

  3. StatusCodePagesMiddleware中间件如何针对响应码呈现错误页面

    StatusCodePagesMiddleware中间件如何针对响应码呈现错误页面 StatusCodePagesMiddleware中间件与ExceptionHandlerMiddleware中间件 ...

  4. 爬虫(Xpath)——爬tieba.baidu.com

    工具:python3 核心知识点: 1)lxml包不能用pip下载,因为里面有其他语言编写的文件 2)urlopen返回的请求是html文件,要使用 content = etree.HTML(html ...

  5. dtexec命令执行SSIS包

    默认情况下,同时安装了 64 位和 32 位版本的 Integration Services 命令提示实用工具的 64 位计算机将在命令提示符处运行 32 位版本.运行 32 位版本的原因是:在 PA ...

  6. springboot springmvc 抛出全局异常解决方法

    springboot中抛出异常,springboot自带的是springmvc框架,这个就不多说了. springmvc统一异常解决方法这里要说明的是.只是结合了springboot的使用而已.直接上 ...

  7. BFC(块级 格式化上下文)的理解

    本文转载(https://segmentfault.com/a/1190000013647777) 一.BFC的概念 1.规范解释 块格式化上下文(Block Formatting Context,B ...

  8. 在使用添加按钮给table插入新的一行时遇见的问题总结及处理方法

    添加按钮的功能:点击添加按钮之后完成添加新的一行. 遇见的问题:当多次点击添加按钮生成新的多行之后,生成的每行内部按钮的保存按钮点击事件出现最晚添加的一行的行内保存点击事件执行一次,倒数第二次添加的行 ...

  9. android studio项目提交Git@OSC

    转载地址:http://www.bubuko.com/infodetail-977061.html 先到git.oscchina.net网站上申请个账号,然后创建一个项目.过程不再说了. 新建工程后, ...

  10. 2015 ACM/ICPC Asia Regional Changchun Online Pro 1005 Travel (Krsukal变形)

    Travel Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Su ...