鱼C论坛

 找回密码
 立即注册
查看: 5178|回复: 19

[已解决]在学习python中遇到一个问题,希望能得到大家的帮助,非常感谢

[复制链接]
发表于 2017-2-12 14:13:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 tianalng233 于 2017-2-13 09:33 编辑

首先是题目: 问题.png
其次是代码:
  1. i = 1
  2. test1 = (i%2 == 1)
  3. test2 = (i%3 == 2)
  4. test3 = (i%5 == 4)
  5. test4 = (i%6 == 5)
  6. test5 = (i%7 == 0)
  7. test = test1 and test2 and test3 and tes4 and test5
  8. while not test:
  9.     i += 1
  10.     print(i)
  11. print(i)
复制代码

最后是运行结果:运行结果是一个死循环.
如图: 运行结果.png

运行结果是强行停止的.然后我找到的原因可能是由于 这一部分代码的问题.
  1. test1 = (i%2 == 1)
  2. test2 = (i%3 == 2)
  3. test3 = (i%5 == 4)
  4. test4 = (i%6 == 5)
  5. test5 = (i%7 == 0)
  6. test = test1 and test2 and test3 and tes4 and test5
  7. while not test:
复制代码

导致test永远为False,从而一直是死循环
我就想问一下,我的这串代码到底是为什么错的.
并且,我在python3的命令行中运行 运行结果1.png 这个又没有问题,那就说明test = test1 and test2 这种形式是正确的.
最佳答案
2017-2-12 17:13:35
tianalng233 发表于 2017-2-12 17:04
我主要纠结的就是

这个部分.

问题就是这个test 判断语句,根本没有和循环体一起进行重复判断,所以test值只进行第一次判断,之后始终为假,也就只能一直输出所有数字。
这方式不可行。
具体你再比对下前辈的方法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-12 14:42:35 | 显示全部楼层
无限循环的原因是,没有提供有效范围,导致所有符合要求的数都打印。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-12 15:36:56 | 显示全部楼层
lubcat 发表于 2017-2-12 14:42
无限循环的原因是,没有提供有效范围,导致所有符合要求的数都打印。

你注意看一下运行结果.它输出的是所有的数,
而且,提供了有效范围之后.
代码如下:
  1. i = 1
  2. test1 = (i%2 == 1)
  3. test2 = (i%3 == 2)
  4. test3 = (i%5 == 4)
  5. test4 = (i%6 == 5)
  6. test5 = (i%7 == 0)
  7. test = test1 and test2 and test3 and tes4 and test5
  8. while i < 1000:
  9.     if test:
  10.         print(i)
  11.     else:
  12.         i += 1
  13.         print(i)#如果不加这句整个程序就会什么都不显示
复制代码

以下是运行结果(ps:权限不够,以及 附件/图片 达到上传数目上限,无法上传):
2 3 4 5 6 7 8 9 10 11 .....996 997 998 999 1000
这就是运行结果
也就意味着test 永远为False

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-12 16:20:42 | 显示全部楼层
tianalng233 发表于 2017-2-12 15:36
你注意看一下运行结果.它输出的是所有的数,
而且,提供了有效范围之后.
代码如下:
  1. test = test1 and test2 and test3 and tes4 and test5
复制代码


这个判断方式不可复用。所以值一直为假,没有改变。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-2-12 16:32:48 | 显示全部楼层
lubcat 发表于 2017-2-12 16:20
这个判断方式不可复用。所以值一直为假,没有改变。

那"不可复用"是为什么呢?可以在哪找到答案?
还有,我修改了以下代码.如果不可复用指的是这个样子的话:
  1. i = 1
  2. test1 = (i%2 == 1)
  3. test2 = (i%3 == 2)
  4. test3 = (i%5 == 4)
  5. test4 = (i%6 == 5)
  6. test5 = (i%7 == 0)

  7. while i < 1000:
  8.     test = test1 and test2 and test3 and tes4 and test5
  9.     if test:
  10.         print(i)
  11.     else:
  12.         i += 1
  13.         print(i)#如果不加这句整个程序就会什么都不显示
复制代码

那还是有问题,输出的结果仍然是从2到1000的自然数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-12 16:34:58 | 显示全部楼层
lubcat 发表于 2017-2-12 16:20
这个判断方式不可复用。所以值一直为假,没有改变。

那"不可复用"是为什么呢?可以在哪找到答案?
还有,我修改了以下代码.如果不可复用指的是这个样子的话:
  1. i = 1
  2. test1 = (i%2 == 1)
  3. test2 = (i%3 == 2)
  4. test3 = (i%5 == 4)
  5. test4 = (i%6 == 5)
  6. test5 = (i%7 == 0)

  7. while i < 1000:
  8.     test = test1 and test2 and test3 and tes4 and test5
  9.     if test:
  10.         print(i)
  11.     else:
  12.         i += 1
  13.         print(i)#如果不加这句整个程序就会什么都不显示
复制代码

那还是有问题,输出的结果仍然是从2到1000的自然数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-12 16:44:14 | 显示全部楼层
本帖最后由 lubcat 于 2017-2-12 16:46 编辑
tianalng233 发表于 2017-2-12 16:34
那"不可复用"是为什么呢?可以在哪找到答案?
还有,我修改了以下代码.如果不可复用指的是这个样子的话:

...




https://www.zhihu.com/question/51806214

知乎上的前辈的解答,共同学习下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-12 17:04:56 | 显示全部楼层
lubcat 发表于 2017-2-12 16:44
https://www.zhihu.com/question/51806214

知乎上的前辈的解答,共同学习下。

我主要纠结的就是
  1. test = test1 and test2 and test3 and tes4 and test5
复制代码

这个部分.
知乎上的这个部分
  1. initValue = 7
  2. while True:
  3.     if initValue % 2 == 1 and initValue % 3 == 2 and \
  4.        initValue % 4 == 3 and initValue % 5 == 4 and \
  5.         initValue % 6 == 5 and initValue % 7 == 0:
  6.             print(initValue)
  7.             break
  8.     else:
  9.         initValue += 7

  10. 作者:杨航锋
  11. 链接:https://www.zhihu.com/question/51806214/answer/127642855
  12. 来源:知乎
  13. 著作权归作者所有,转载请联系作者获得授权。
复制代码

我知道这样做的是可以的.但是我就是想知道到底是哪出错了,
  1. test = test1 and test2 and test3 and tes4 and test5
复制代码

这种方式根本就不行还是我的代码出问题.另外,非常感谢你的帮助!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-12 17:13:35 | 显示全部楼层    本楼为最佳答案   
tianalng233 发表于 2017-2-12 17:04
我主要纠结的就是

这个部分.

问题就是这个test 判断语句,根本没有和循环体一起进行重复判断,所以test值只进行第一次判断,之后始终为假,也就只能一直输出所有数字。
这方式不可行。
具体你再比对下前辈的方法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-12 17:18:21 | 显示全部楼层
lubcat 发表于 2017-2-12 17:13
问题就是这个test 判断语句,根本没有和循环体一起进行重复判断,所以test值只进行第一次判断,之后始终 ...

根据你说的,我又修改了一下.结果仍然没有改变,还是2~1000.
  1. i = 1
  2. test1 = (i%2 == 1)
  3. test2 = (i%3 == 2)
  4. test3 = (i%5 == 4)
  5. test4 = (i%6 == 5)
  6. test5 = (i%7 == 0)

  7. while i < 1000:
  8.     if test1 and test2 and test3 and test4 and test5:
  9.         print(i)
  10.     else:
  11.         i += 1
  12.         print(i)#如果不加这句整个程序就会什么都不显示
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-12 17:56:58 | 显示全部楼层
tianalng233 发表于 2017-2-12 17:18
根据你说的,我又修改了一下.结果仍然没有改变,还是2~1000.

我想我大概明白你的意思了.非常感谢.以下是修改后的代码.
  1. i = 1

  2. while i < 1000:
  3.     test1 = (i%2 == 1)
  4.     test2 = (i%3 == 2)
  5.     test3 = (i%5 == 4)
  6.     test4 = (i%6 == 5)
  7.     test5 = (i%7 == 0)

  8.     if test1 and test2 and test3 and test4 and test5:
  9.         print(i)
  10.         break
  11.     else:
  12.         i += 1
复制代码

最后,非常非常感谢你的帮助
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-12 18:05:27 | 显示全部楼层
其实吧……
只要把每一步结果都算以下……
很容易发现问题……
在i ==1的时候……
1 % 2 == 1
1 % 3 == 1
1 % 4 == 1
……
所以test1 == 1(True),test2 == test3 == test4 == test5 == 0(False)
所以test == False(0)
于是下面循环就变成了:
  1. i = 1
  2. while True:
  3.     i += 1
  4.     print(i)
复制代码

毫无疑问的陷入了死循环……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-2-12 18:15:03 | 显示全部楼层
sd小舅子 发表于 2017-2-12 18:05
其实吧……
只要把每一步结果都算以下……
很容易发现问题……

是这样
test 作为布尔值,只经过了一次运算,之后的循环没有再参与 ,所以形成了死循环。
如果不把test1-test5的赋值放入循环中,test是不会有变动的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-12 18:28:13 | 显示全部楼层
tianalng233 发表于 2017-2-12 17:56
我想我大概明白你的意思了.非常感谢.以下是修改后的代码.

最后,非常非常感谢你的帮助

所有涉及条件判断的语句都需要加入到循环内,才能进行每次的条件判断。所以不能只把test放进去。
while的条件可以恒为真,<1000这个条件没起任何作用。

PS:
有个小疑问,10000以内满足要求的数,要如何修改可以 达成?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-12 18:47:16 | 显示全部楼层
lubcat 发表于 2017-2-12 18:28
所有涉及条件判断的语句都需要加入到循环内,才能进行每次的条件判断。所以不能只把test放进去。
while ...
  1. i = 7
  2. k = 0
  3. while i <= 10000:
  4.     if (i%2 == 1) and (i%3 == 2) and (i%5 == 4) \
  5.         and (i%6 == 5):
  6.         print(i, end="  ")
  7.         #这部分是为了让结果每5个输出一行
  8.         k += 1
  9.         if k%5 == 0:
  10.             print("\n")

  11.     i += 7
复制代码

这是代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-12 19:11:59 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-13 09:46:00 | 显示全部楼层
从第2行代码看不懂为什么那样子写
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-13 10:19:36 | 显示全部楼层
五行缺五行 发表于 2017-2-13 09:46
从第2行代码看不懂为什么那样子写

当时主要是想着这样可以让后面的条件判断简洁一点.所以想用一个变量名来代替,结果是在值为bool 类型的条件下,一个变量只能使用一次.所以就悲剧了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-13 16:51:34 | 显示全部楼层
很久没用py了,但是记得py是严格遵守首行缩进,很多问题都是源于这样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-13 16:53:35 | 显示全部楼层
加油加油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 07:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表