M小姐 发表于 2021-5-19 16:13:24

求大神分析:下面两个代码中sum变量位置不同,导致其中一个代码运行不了的原因

题目来源:零基础学Python,第009讲,课后习题,动动手第1题。

原题:编写一个程序,求 100~999 之间的所有水仙花数。
        如果一个 3 位数等于其各位数字的立方和,则称这个数为水仙花数。例如:153 = 1^3 + 5^3 + 3^3,因此 153 就是一个水仙花数。

代码一:
sum = 0
for i in range(100,1000):
    temp = i
    while temp:
      sum = sum + (temp%10)**3
      temp //= 10
    if sum == i:
      print(i)

代码二:
for i in range(100, 1000):
    sum = 0
    temp = i
    while temp:
      sum = sum + (temp%10) ** 3
      temp //= 10      
    if sum == i:
      print(i)

附图为代码一和代码二分别运行的结果,求大神分析下为什么代码一运行失败了???🙏🙏🙏

      



qq1151985918 发表于 2021-5-19 16:21:48

把 sum = 0 从第一行改到第二行就好了,因为每次算完结果 sum的值没有重置,还在原来基础继续求和。for i in range(100,1000):
    sum = 0
    temp = i
    while temp:
      sum = sum + (temp%10)**3
      temp //= 10
    if sum == i:
      print(i)

Peteryo01223 发表于 2021-5-19 16:24:51

本帖最后由 Peteryo01223 于 2021-5-19 16:40 编辑

我的理解:代码一里,sum是个全局变量,不跟随后面的 for 循环被重新赋值。代码二里,sum是个局部变量,可以随时被赋值。
FishC说过,全局变量危害大。请谨慎使用。
全局变量的危害:

[*]不必要的常量频繁使用,代码阅读变得吃力;
[*]会导致软件分层的不合理,全局变量相当于一条快捷通道,它容易使程序员模糊了“设备层”和“应用层”之间的边界。
[*]软件的分层不合理,到了后期维护,哪怕仅是增加修改删除小功能,往往要从上到下掘地三尺地修改;
[*]全局变量大量使用,少不了有些变量流连忘返于中断与主回圈程序之间。这个时候如果处理不当,系统的bug就是随机出现的,无规律的,这时候初步显示出病入膏肓的特征来了,没有大牛来力挽狂澜,注定慢性死亡。
[*]如果您的系统中大量使用全局变量,那么您已经成功得到一个畸形的系统,它处于一个神秘的稳定状态!你看着这台机器,机器也看着你,相对无言,心中发毛。你不确定它什么时候会崩溃,也不晓得下一次投诉什么时候会到来。

M小姐 发表于 2021-5-19 16:53:01

谢谢您的解答~~
如果这是一个结论,我倒是以后都能记住。
但就是这个小代码里用全局变量来解释多少感觉有点大材小用的感觉,,,因为代码一里除了for循环里用得上sum这个变量外,跳出循环sum也都不需要被重新赋值了呀。
哦,对了,我确是第一次学python,之前只知道变量,却不知道变量还分全局变量和局部变量,能解释以下吗🙏🙏

jackz007 发表于 2021-5-19 16:54:06

本帖最后由 jackz007 于 2021-5-19 16:57 编辑

         对于每个 i,sum 都必须是从 0 值开始累加,如果不清 0,sum 的值就不是 100~999 之间某个数 (i) 三个位的立方和,而是从 100 到这个数 (i) 所有数三个位立方和的总和,你认为那样合适吗?代码一就存在这个问题。
   

Peteryo01223 发表于 2021-5-19 17:18:55

本帖最后由 Peteryo01223 于 2021-5-19 17:35 编辑

M小姐 发表于 2021-5-19 16:53
谢谢您的解答~~
如果这是一个结论,我倒是以后都能记住。
但就是这个小代码里用全局变量来解释多少感觉 ...

我帮助解释一下上面 Jackz007 的回答,以 Jackz007 的原文为准。

[*]每次 Python 选出一个100至1000之间的 i,Python 就要计算一次这个 i 的 sum 的值,即:用这个 i 赋值了的 temp 的个、十、百三个位置上的单个数字提取出来,计算他们三个的立方和,得到一个 sum 的值。然后判断,这个 sum 的值是不是等于这个 i。是的话,就 print 。然后,下一个 for 循环又开始了,i 的值变了,sum 必须要做清零的动作(代码2),才能开始新的判断。
[*]在此过程中,如果 sum 是一个全局变量的话(代码1),sum 不在每次 for 循环开始时归零,那么 Python 计算 sum 值的时候,会出现不同 i 值之间的不同 sum 的叠加,就乱了,不符合题目要求。


另外:全局变量与局部变量两者的本质区别就是在于作用域(我网上抄的),用通俗的话来理解的话, 全局变量是在整个py文件中声明,全局范围内都可以访问 局部变量是在某个函数中声明的,只能在该函数中调用它。

M小姐 发表于 2021-5-19 17:33:26

jackz007 发表于 2021-5-19 16:54
对于每个 i,sum 都必须是从 0 值开始累加,如果不清 0,sum 的值就不是 100~999 之间某个数 (i)...

谢谢,一语中的,我现在明白了。

M小姐 发表于 2021-5-19 17:35:13

Peteryo01223 发表于 2021-5-19 17:18
我帮助解释一下上面 Jackz007 的回答,以 Jackz007 的原文为准。

[*]每次Python选出一个100至1000之 ...

嗯嗯,谢谢您的详细解答,我知道代码一中存在的问题了。

M小姐 发表于 2021-5-19 17:36:07

qq1151985918 发表于 2021-5-19 16:21
把 sum = 0 从第一行改到第二行就好了,因为每次算完结果 sum的值没有重置,还在原来基础继续求和。

明白了,谢谢您
页: [1]
查看完整版本: 求大神分析:下面两个代码中sum变量位置不同,导致其中一个代码运行不了的原因