鱼C论坛

 找回密码
 立即注册
查看: 1557|回复: 8

[已解决]for循环嵌套while循环

[复制链接]
发表于 2018-4-14 14:30:48 | 显示全部楼层 |阅读模式

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

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

x
我用下方代码运行出来的结果很无法理解。为什么i =2的时候,输出的是1 0呢?
A = [0,0,-1,0]
for i in range(len(A)):
    while (i<len(A)) and (A[i] >=0):
        print(i, A[i])
        i=i+1
输出结果:
0 0
1 0
1 0
3 0
各位大神,能否告知一下正确的思路呢?谢谢!
最佳答案
2018-4-14 15:43:06
i=2没进while循环,i=0时,在循环里打印了i和A[i]
在while循环里i加了1变成1,又打印了i和A[i]
而变成2的时候while不满足跳出
进行for的下一次循环,i被置1,于是出现了重复的2次i(此时为1)和对应的A[i]
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-4-14 14:52:46 | 显示全部楼层
i=2的时候没有打印任何内容,i=1的时候打印了两行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-14 15:21:09 | 显示全部楼层
gopythoner 发表于 2018-4-14 14:52
i=2的时候没有打印任何内容,i=1的时候打印了两行

i=1为什么会打印两行呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-14 15:43:06 | 显示全部楼层    本楼为最佳答案   
i=2没进while循环,i=0时,在循环里打印了i和A[i]
在while循环里i加了1变成1,又打印了i和A[i]
而变成2的时候while不满足跳出
进行for的下一次循环,i被置1,于是出现了重复的2次i(此时为1)和对应的A[i]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-14 15:56:48 | 显示全部楼层
>>> import dis
>>> def foo():
        a = [0,0,-1,0]
        for i in range(len(a)):
                while i<len(a) and a[i]<=0:
                        print(i, a[i])
                        i = i + 1

                       
>>> dis.dis(foo)
  2           0 LOAD_CONST               1 (0)
              2 LOAD_CONST               1 (0)
              4 LOAD_CONST               3 (-1)
              6 LOAD_CONST               1 (0)
              8 BUILD_LIST               4
             10 STORE_FAST               0 (a)

  3          12 SETUP_LOOP              72 (to 86)
             14 LOAD_GLOBAL              0 (range)
             16 LOAD_GLOBAL              1 (len)
             18 LOAD_FAST                0 (a)
             20 CALL_FUNCTION            1
             22 CALL_FUNCTION            1
             24 GET_ITER
        >>   26 FOR_ITER                56 (to 84)
             28 STORE_FAST               1 (i)

  4          30 SETUP_LOOP              50 (to 82)
        >>   32 LOAD_FAST                1 (i)
             34 LOAD_GLOBAL              1 (len)
             36 LOAD_FAST                0 (a)
             38 CALL_FUNCTION            1
             40 COMPARE_OP               0 (<)
             42 POP_JUMP_IF_FALSE       80
             44 LOAD_FAST                0 (a)
             46 LOAD_FAST                1 (i)
             48 BINARY_SUBSCR
             50 LOAD_CONST               1 (0)
             52 COMPARE_OP               1 (<=)
             54 POP_JUMP_IF_FALSE       80

  5          56 LOAD_GLOBAL              2 (print)
             58 LOAD_FAST                1 (i)
             60 LOAD_FAST                0 (a)
             62 LOAD_FAST                1 (i)
             64 BINARY_SUBSCR
             66 CALL_FUNCTION            2
             68 POP_TOP

  6          70 LOAD_FAST                1 (i)
             72 LOAD_CONST               2 (1)
             74 BINARY_ADD
             76 STORE_FAST               1 (i)
             78 JUMP_ABSOLUTE           32
        >>   80 POP_BLOCK
        >>   82 JUMP_ABSOLUTE           26
        >>   84 POP_BLOCK
        >>   86 LOAD_CONST               0 (None)
             88 RETURN_VALUE
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-14 16:00:05 | 显示全部楼层
>>> def func():
        a = [0,0,-1,0]
        for i in range(len(a)):
                if i<len(a) and a[i]>=0:
                        print(i, a[i])

>>> func()
0 0
1 0
3 0
=============
看你的意思,应该是要把while改成if的节奏。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-14 16:03:26 | 显示全部楼层
本帖最后由 ABC23 于 2018-4-14 16:04 编辑

上面说的没错。
i==1的时候打印了两次
================
>>> def foo():
        a = [0,1,-1,3]
        for i in range(len(a)):
                while i<len(a) and a[i]>=0:
                        print(i, a[i])
                        i = i + 1

                       
>>> foo()
0 0
1 1
1 1
3 3
===========
看这个例子可能会有帮助。
主要是考虑除了while外面还有for循环,会改变i的值。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-14 16:13:21 | 显示全部楼层
塔利班 发表于 2018-4-14 15:43
i=2没进while循环,i=0时,在循环里打印了i和A
在while循环里i加了1变成1,又打印了i和A
而变成2的时候wh ...

第一次看见for循环还能往回走的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-14 16:22:20 | 显示全部楼层
ABC23 发表于 2018-4-14 15:56
>>> import dis
>>> def foo():
        a = [0,0,-1,0]

大神看不懂。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-10 13:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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