最近学到了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. 项目部署到centos7云端验证码出现乱码

    原因:linux系统字体和设置验证码的字体不一致 参考文献: https://www.whatled.com/post-6169.html 本次项目我使用的字体是    Arial

  2. 01SpringBase

    Spring (容器) 概述: 01.Java EE开发者的春天 02.主要目的是 降低业务逻辑层和其他层的耦合度 IOC 03.spring容器是用来创建(new)和管理(对象之间的关系)程序中所有 ...

  3. sql语句优化及后一条减前一条

    sql语句优化: 1.表加索引 2.少用like,直接用=所有值 3.where语句把能大量筛查的条件写在前面 4.数据量大时,参与计算的值相同时只取一条 后一条减前一条, select houec, ...

  4. VS连接Access数据库--连接字符串及执行查询语句的方法(增删改查,用户名查重,根据用户获取密码查询)

    ACCESS数据的连接及语句执行操作,不难,久不用会生疏,每次都要找资料,干脆自己整理下,记录下来,需要的时候,直接查看,提高效率.也供初学者参考 1.连接字符串 public static stri ...

  5. 帝国empirecms数据库数据表详细说明

    表名   解释 phome_ecms_infoclass_news 新闻采集规则记录表 phome_ecms_infotmp_news 采集临时表 phome_ecms_news 新闻主数据记录表 p ...

  6. so文件动态加载注意事项

    动态加载是指将so文件存放于服务器,在需要用的时候,通过服务器下载到本地,然后加载. 需要注意的: 手机cpu架构,不同的架构运行不同的so 解决方法: 1,欺骗性: 如果so架构不全,就在apk打包 ...

  7. escape,encodeURI,encodeURIComponent 之间的区别和使用

    escape(目前已经被淘汰)是对字符串(string)进行编码(而另外两种是对URL),不会对下列字符编码 ASCII字母  数字  @*/+ 最关键的是,当你需要对URL编码时,请忘记这个方法,这 ...

  8. IT部门域事件与业务分析

    IT event--->system--->IT dept |--------------->IT dept |--------------->system 域事件分类: 直接 ...

  9. (原创)linux下Microsoft/cpprestsdk支持https(server)

    原创,转载请标明源地址 之前看网上一堆的资料说Microsoft/cpprestsdk不支持https或者说只支持window下的https,差点就被误导了,没办法,只好自己去翻了下源代码 先说明下l ...

  10. OSSIM安装与使用感受

    下载地址 http://www.alienvault.com OSSIM通过将开源产品进行集成,从而提供一种能够实现安全监控功能的基础平台.它的目标是提供一种集中式.有组织的,能够更好地进行监测和显示 ...