见招拆招小冬喜 发表于 2020-10-5 17:19:05

if循环问题

本帖最后由 见招拆招小冬喜 于 2020-10-5 17:31 编辑

不明白为什么这个代码无法运行,下面那个代码就可以?他们只有标红部分不同

错误代码:
x=7
i=1
flag=0
while i<=100:
    if (x%2 == 1) and (x%3 == 2) and (x%5 == 4) and (x%6==5):
      flag=1
    else:
      x=7*(i+1)
      i+=1
if flag==1:
    print("楼梯阶数是:",x)
else:
    print("未在设定范围内找到答案")

结果:
=========================== RESTART: d:/我的文档/桌面/1.py ===========================

正确代码:
x=7
i=1
flag=0
while i<=100:
    if (x%2 == 1) and (x%3 == 2) and (x%5 == 4) and (x%6==5):
      flag=1
    else:
      x=7*(i+1)
    i+=1
if flag==1:
    print("楼梯阶数是:",x)
else:
    print("未在设定范围内找到答案")

结果:
=========================== RESTART: d:/我的文档/桌面/1.py ===========================
楼梯阶数是: 119

请各位指教~

昨非 发表于 2020-10-5 17:23:50

python严格要求缩进,你上面的代码不符合缩进规则,既没有与x对齐,也没有与else对齐,所以缩进报错

昨非 发表于 2020-10-5 17:25:17

IndentationError: unindent does not match any outer indentation level
翻译为:缩进错误:未缩进与任何外部缩进级别都不匹配

见招拆招小冬喜 发表于 2020-10-5 17:30:05

昨非 发表于 2020-10-5 17:23
python严格要求缩进,你上面的代码不符合缩进规则,既没有与x对齐,也没有与else对齐,所以缩进报错

不好意思,这个是我输入问题事的疏忽,但是即使正确缩进了仍然无法运行,并没有缩进报错提示,只有这样的界面:
>>>
=========================== RESTART: d:/我的文档/桌面/1.py ===========================

昨非 发表于 2020-10-5 17:33:21

见招拆招小冬喜 发表于 2020-10-5 17:30
不好意思,这个是我输入问题事的疏忽,但是即使正确缩进了仍然无法运行,并没有缩进报错提示,只有这样的 ...

你怎么改的

昨非 发表于 2020-10-5 17:40:34

见招拆招小冬喜 发表于 2020-10-5 17:30
不好意思,这个是我输入问题事的疏忽,但是即使正确缩进了仍然无法运行,并没有缩进报错提示,只有这样的 ...

你如果改成与x相同的缩进,那么你的代码就错了,i作为循环变量,每循环一次执行i+=1
不能放到else里,

见招拆招小冬喜 发表于 2020-10-5 17:40:47

昨非 发表于 2020-10-5 17:33
你怎么改的

唯一的区别就是我标红的部分,一个是缩进到else之后,一个是跟else齐平。我不太明白这两者的区别是什么?只要if的条件不满足,不管是不是在else的范围内,i=i+1都能执行,为什么缩进到else之后就不能运行了?

见招拆招小冬喜 发表于 2020-10-5 17:43:45

昨非 发表于 2020-10-5 17:40
你如果改成与x相同的缩进,那么你的代码就错了,i作为循环变量,每循环一次执行i+=1
不能放到else里,

为什么不可以呢?
不满足if就执行else。那把循环放在else里,不是就可以执行了吗?如果满足if,直接撤出循环,i也不必再循环了。
是不是我的理解哪里不对...我有点懵了

昨非 发表于 2020-10-5 17:50:11

见招拆招小冬喜 发表于 2020-10-5 17:43
为什么不可以呢?
不满足if就执行else。那把循环放在else里,不是就可以执行了吗?如果满足if,直接撤出 ...

放到else里,准确的说是进入死循环了,它会停在i = 17处,虽然flag = 1了,但是i+=1,被else语句跳过了,循环出不来了

昨非 发表于 2020-10-5 17:51:14

本帖最后由 昨非 于 2020-10-5 17:52 编辑

加个打印助于理解

x=7
i=1
flag=0
while i<=100:
    if (x%2 == 1) and (x%3 == 2) and (x%5 == 4) and (x%6==5):
      flag=1
    else:
      x=7*(i+1)
      i+=1
      print(i)
if flag==1:
    print("楼梯阶数是:",x)
else:
    print("未在设定范围内找到答案")


满意的话,记得给个【最佳】

沐羽尘 发表于 2020-10-5 17:57:22

用while循环的确应该注意会不会进入死循环,楼上那位兄弟说得对,emmm我试了一下,加个break就可以跳出循环了x=7
i=1
flag=0
while i<=100:
    if (x%2 == 1) and (x%3 == 2) and (x%5 == 4) and (x%6==5):
      flag=1
      break
    else:
      x=7*(i+1)
      i+=1
if flag==1:
    print("楼梯阶数是:",x)
else:
    print("未在设定范围内找到答案")

见招拆招小冬喜 发表于 2020-10-5 18:02:24

昨非 发表于 2020-10-5 17:50
放到else里,准确的说是进入死循环了,它会停在i = 17处,虽然flag = 1了,但是i+=1,被else语句跳过了, ...

不明白为什么“虽然flag = 1了,但是i+=1,被else语句跳过了,循环出不来了”。flag=1为什么会出不来循环?这个跟else有什么关系?

我按您的代码做了尝试:
和您的代码相同时,结果为:
>>>
=========================== RESTART: d:/我的文档/桌面/1.py ===========================
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

如果把i与else齐平(代码如下),是这种情况,为什么i变到101,x才119?

x=7
i=1
flag=0
while i<=100:
    if (x%2 == 1) and (x%3 == 2) and (x%5 == 4) and (x%6==5):
      flag=1
    else:
      x=7*(i+1)
    i+=1
    print(i)
if flag==1:
    print("楼梯阶数是:",x)
else:
    print("未在设定范围内找到答案")

结果:
=========================== RESTART: d:/我的文档/桌面/1.py ===========================
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
楼梯阶数是: 119

见招拆招小冬喜 发表于 2020-10-5 18:04:54

沐羽尘 发表于 2020-10-5 17:57
用while循环的确应该注意会不会进入死循环,楼上那位兄弟说得对,emmm我试了一下,加个break就可以跳出循环 ...

能告诉我为什么while会死循环吗?如果if条件符合,if的循环不是就赋值flag=1,这样不是就满足下面的if条件了吗?

昨非 发表于 2020-10-5 18:07:33

见招拆招小冬喜 发表于 2020-10-5 18:04
能告诉我为什么while会死循环吗?如果if条件符合,if的循环不是就赋值flag=1,这样不是就满足下面的if条 ...

但是跳出while循环的条件是i大于100,你的i到17停了,不就一直在while循环里出不来了吗

昨非 发表于 2020-10-5 18:09:51

见招拆招小冬喜 发表于 2020-10-5 18:04
能告诉我为什么while会死循环吗?如果if条件符合,if的循环不是就赋值flag=1,这样不是就满足下面的if条 ...

if的条件是flag等于1没错,但前提是while执行完了才会执行if

见招拆招小冬喜 发表于 2020-10-5 18:11:37

昨非 发表于 2020-10-5 18:07
但是跳出while循环的条件是i大于100,你的i到17停了,不就一直在while循环里出不来了吗

哦哦,是不是在成功赋值flag=1之后,i 还在循环,直到while为假。但如果把 i+=1 放在else之后,赋值flag=1之后,else不再执行,i 不再循环变大,始终满足while为真就出不去了?

昨非 发表于 2020-10-5 18:12:15

见招拆招小冬喜 发表于 2020-10-5 18:11
哦哦,是不是在成功赋值flag=1之后,i 还在循环,直到while为假。但如果把 i+=1 放在else之后,赋值flag= ...

见招拆招小冬喜 发表于 2020-10-5 18:12:38

昨非 发表于 2020-10-5 18:12


我终于懂了!谢谢您!

沐羽尘 发表于 2020-10-5 18:12:50

见招拆招小冬喜 发表于 2020-10-5 18:04
能告诉我为什么while会死循环吗?如果if条件符合,if的循环不是就赋值flag=1,这样不是就满足下面的if条 ...

楼上那位说的对呀,你都写了while i<=100,但i最后只能在17,当然跳不出循环了{:10_277:}

见招拆招小冬喜 发表于 2020-10-5 18:17:36

沐羽尘 发表于 2020-10-5 18:12
楼上那位说的对呀,你都写了while i

哈哈我一直理解错了,我一直以为是跳不出if的循环,忘记了下面的程序是跟while并列的。持续给i赋值跳出while循环,然后才能执行下面的。
小白出丑了,请见谅...
页: [1] 2
查看完整版本: if循环问题