初学Python案例之一(开平方代码)

这是网友@石头提交的答案,对初学者很有参考价值。请注意,计算机编程解决问题,代码不一样,有好多种方案,很正常。题目是这样的(现在为了探讨,题目略作变化),给定一个自然数,求出它的平方根,答案可以保留小数到两位,也可以更多,随意。后来为了简化,可能又简化到了答案也必须是自然数,@石头的答案显然可能受这个约束,请你将上述代码在自己电脑上运行,可能的话,在里面插入几个print来看看里面究竟发生了什么。

我们今天讨论,更正为答案可以是小数,小数点后面随意。
在互动交流之初,笔者跟大家分享了古代希罗的算法,注意,他生活在古代,那时候,没有计算机。所以是一种手工计算的方式,大体是这样的,给定一个数 x,要求给出计算其平方根的算法,注意是算法,而据说希罗就是给出算法的第一人,算法这个词应该是希罗之后才开始使用的词汇。所以这里我们说,给出一些计算的方法,以求得这个平方根。希罗的方法是这样的,随机选择一个数g, 然后验证是否是答案(验证的标准我们暂定为答案和给定数之间的差,要么大于1和要么小于1中的第一个数),如果符合标准,我们停止计算,宣布这就是答案,如果不符合标准,就套用这个公式 g = (g + x/g)/ 2, 得出的g, 重新验证,看是否符合答案标准,如果符合,结束计算,宣布答案。如果没有符合标准,继续这么做,你说是循环也好,顺序也好,在这里并没有什么差别。自己好好体会一下,电脑是不是这样顺序执行的。因为Python并不需要关注底层,我们初学Python的人也没有必要关注底层,这大概是Python的优势吧。
我就希望有人,不用while,不用for, 只用if else写出这个代码来,跟大家分享,让初学者真正体会计算机的顺序执行。以及所谓的循环究竟如何理解。
当然,开平方的算法有很多种,这个陆续会分享的,不要急,一步一步来。
下面是我在(Mark学编程)QQ群里点评的@石头的代码,供大家参考。

为了节约时间,我把(Mark学编程)QQ群里的原话拿出来,适当编辑了一下,就是下面这个样子。

这个实现了用for解决此问题的方法,虽然和原题有出入,但显然,它是正确的,当然,这个还有改进空间。谁愿意改进,就在此基础上改进吧。

提出几个小点供参考,第一行,用键盘输入方法很灵活,在input函数下,键盘输入返回的是什么类型,这个大家要搞清楚,请自行使用type看看。使用eval可以,但好像不是推荐的方法,这个会有不同意见,使用int行不行?

第二行,用的内置函数和for循环,先不谈for循环,谈内置函数range, 请一定要掌握,多做些range的代码就行了。

还是第二行,range(括号内的式子,为何是这样,这是改进了算法?为什么加2,这个的总体是算法问题,不是现在要讨论的)

for 循环里面用了if非常好,里面是我们事先界定的答案的条件,就是当 gg 靠近 x 还有 不到 0.01时,我们就说,我们找到答案了,非常符合原来的题意。但为什么后面成了(g+1)(g+1)? 这个有改进空间吗?这个大家思考,其实也超出了初学者的范围,也是有关算法的问题。

第4行,打印出g, 顺便说一句,如果将g字母改成answer这个英文单词,是否更亲切了,也更符合望文生义。

等大家起床了,我会继续跟大家谈一个非常重要,但是,一定是被忽略的问题,那就是,计算机是顺序执行的,就是 while 也好,for 也好,都是可以展开拉成直线的顺序执行的,我期待的跟原题一模一样的直线程序没有出现。假设,你还没有学习while,更没有学习for, 而是只学了 if 和 else,你可能反而写的出来一个和原题一样的东西,就提示到这里,希望大家能看到这样的代码,于是乎,大家才重点注意到了这个问题,才能够本质上讲,程序就是顺序执行的,在上帝造计算机的起初阶段,并不存在while,也不存在for, 只存在一条线性的长长的纸条,想一想最初的计算机就是用一个打着孔的长长的纸条来做程序的,现在的电脑原理依然如此,还有,如果你听说图灵机模型,你就会知道,原来计算机就是做两件事,计算和存储,就这么简单。只不过每秒计算亿次以上吧了。MIT教授,在(编程导论的第一句话是这么写的:计算机只做两件事,执行计算并记录计算的结果,你可能会困扰,就这么简单,你先这么困扰着吧。没有关系。我说的你可能不信,MIT教授的话,我们总该相信吧。

今天我还会写一遍文章,举一些我知道的个人学习编程的简单案例供大家参考,这些其实都来自我这几天接触的例子。

你可能感兴趣的:(教程,Python)