李二蛋 发表于 2021-9-25 12:56:11

水仙花for循环可以嵌套么,逻辑是怎样的


不知道图片传上去没有
代码:
for z in range(10):
    for y in range(10):
      for x in range(1,10):
            i = z + y*10 + x*100
            if z**3 + y**3 + x**3 == i:
                print(i)
                break/(continue是一样的)
输出结果:
370
371
153
407
请问这个代码的逻辑是怎样的,break跳出后到哪里去了?希望能得到详细解答
我的猜想:
z按顺序选1,y按顺序选7,x按顺序选3
i=371
1**3+7**3+3**3==371判定成立
打印371,跳出x循环到y循环,此时z还是等于1,y=7,x按顺序选4
i=471
1**3+7**3+4**3==471判定不成立
跳出x循环到y循环,当x从0取到9全部判定完成,z还是等于1,此时y=8继续判定x从0-9

深谙流年 发表于 2021-9-25 13:03:53

debug一下直接全清楚

柿子饼同学 发表于 2021-9-25 13:16:49

本帖最后由 柿子饼同学 于 2021-9-25 15:02 编辑

先是z = 0, y = 0, x = 1, 然后 x = 2 , 等到 x = 9 的下一次是 , 变成 z = 0, y = 1, x = 0 酱紫
顺序 :
>>> for i in range(10):
        for j in range(10):
                for s in range(10):
                        print(i * 100 + j *10 + s, end = ' ' )

0 1 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 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 18
就是 x 每到 9 的下一次 , y 就加一 , y 每次到 9 的下一次 , z 就加一,
不明白可以运行下面的代码试试
for z in range(10):
        for y in range(10):
                for x in range(10):
                        print(z, y, x)
break 只能跳出一层循环 , 也就是跳出 for x in range(10) , 继续执行 for y in range(10)

jackz007 发表于 2021-9-25 13:33:56

      break 跳出的是最贴身的那层循环,对于本例而言,就是 for x in range(1 , 10),跳出后,会直接来到 for y in range(10) 处继续执行。

李二蛋 发表于 2021-9-25 15:22:22

柿子饼同学 发表于 2021-9-25 13:16
先是z = 0, y = 0, x = 1, 然后 x = 2 , 等到 x = 9 的下一次是 , 变成 z = 0, y = 1, x = 0 酱紫
顺序 :...

非常感谢您的指导,请问您:
按照for的嵌套等级逻辑,若z = 0,y = 0,x = 3时满足条件跳出for x in range(10)循环,继续执行for y in range(10),那么在这个时候y取什么值?x取什么值?

李二蛋 发表于 2021-9-25 15:24:10

jackz007 发表于 2021-9-25 13:33
break 跳出的是最贴身的那层循环,对于本例而言,就是 for x in range(1 , 10),跳出后,会直接来 ...

非常感谢您的指导,请问您:
按照for的嵌套等级逻辑,若z = 0,y = 0,x = 3时满足条件跳出for x in range(10)循环,继续执行for y in range(10),那么在这个时候y取什么值?x取什么值?
是y还是取0,x继续取4?
还是y直接取1,x从0开始取?

李二蛋 发表于 2021-9-25 15:24:47

李二蛋 发表于 2021-9-25 15:22
非常感谢您的指导,请问您:
按照for的嵌套等级逻辑,若z = 0,y = 0,x = 3时满足条件跳出for x in ran ...

是y还是取0,x继续取4?
还是y直接取1,x从0开始取?

柿子饼同学 发表于 2021-9-25 16:49:36

本帖最后由 柿子饼同学 于 2021-9-25 16:51 编辑

李二蛋 发表于 2021-9-25 15:24
非常感谢您的指导,请问您:
按照for的嵌套等级逻辑,若z = 0,y = 0,x = 3时满足条件跳出for x in ran ...

我简单举个栗子 , 可以看到满足条件时, i 加 1 , j 归 0
所以你那个也是一样的 , x == 3 时 , y 加一 , x 归零
有些问题 , 自己可以试一试 , 学习后的效果更好
>>> for i in range(5):
        for j in range(5):
                if j == 3:
                        break
                print(i, j)

0 0
0 1
0 2
1 0
1 1
1 2
2 0
2 1
2 2
3 0
3 1
3 2
4 0
4 1
4 2
>>>

jackz007 发表于 2021-9-25 16:53:50

本帖最后由 jackz007 于 2021-9-25 17:10 编辑

李二蛋 发表于 2021-9-25 15:24
非常感谢您的指导,请问您:
按照for的嵌套等级逻辑,若z = 0,y = 0,x = 3时满足条件跳出for x in ran ...

       比如你的代码,第一次执行 break 的时候,z = 0, y = 7 , x = 3,i = 370,跳出 for x in range(1 , 10) 意味着 for y in range(10) 循环的 y = 7 的那次循环已经结束,下一次的循环就是 y = 8 了,也就是 z = 0 , y = 8,然后,完成 for x in range(1 , 10) 的循环,这个循环也将执行 9 次,会继续完成对 i 值分别为 180、280、380、480、580、680、780、880、980 一共 9 个值的验证和筛选。
       当 z = 0 for y in range(10) 的循环完成时,会返回到 for z in range(10) 处继续,这时,循环变量 z 的下一个数值是 z = 1 ,于是,在 z = 1 的条件下,又开始了新一轮的for y in range(10) 的循环。当然,对于内层循环 for x in range(1 , 10),它和其外层性循环 for y in range(10) 的关系和前面说的情况完全一样。嵌套循环内外层的关系是,外环走一步,内环走一圈。

晴雨皆宜 发表于 2021-9-25 21:56:18


开卷有益,多多益善····
页: [1]
查看完整版本: 水仙花for循环可以嵌套么,逻辑是怎样的