Python" while"循环没有按预期结束

时间:2014-10-30 01:13:27

标签: python while-loop

我想成为" Python-esque"在我的代码中,我试图连续调用三个函数,第二个只在第一个没有产生结果的情况下被调用,而第三个仅在第一个和第二个没有被调用时被调用...

sky = "none"
while sky == "none":
    sky = searchUnguided(inframe, skysearch, debug=debug)
    sky = searchPQ(ad, skysearch, maxpq, debug=debug)
    sky = searchAB(ad, maxpq, debug=debug)
    break

这些功能searchUnguidedsearchPQsearchAB中的每一项都会返回一个值,默认情况下为none,但可以更改为其他值。这些"其他东西"我希望停止while sky == "none"循环的情况。然而,它并没有像我期望的那样工作,即使第一个函数返回none之外的其他内容,也会调用所有三个函数。

一个函数的示例(已验证它按预期返回非none值):

def searchUnguided(filename, skysearch, debug=False):
    utdate = filename[1:9]
    n = int(filename[11:15])
    skyout = "none"
    for ndiff in skysearch:
        sn = n - ndiff
        skyim = "N" + utdate + "S" + str(sn).zfill(4)
        fskyim = os.path.join(rawdir, skyim + ".fits")
        try:
            sad = AD.read(fskyim, mode='readonly')
            if getstate(sad, "frozen") != "none":
                # we found a sky!
                skyout = skyim
                break
        except:
            continue
    return skyout

我误解了while循环的工作方式吗?我总是可以使用嵌套的if语句,但这看起来很啰嗦......

提前致谢!

4 个答案:

答案 0 :(得分:1)

在这种情况下,while循环不起作用,因为第一次将它评估为true,并且由于中断而第二次没有评估

看起来好像不是一个糟糕的方式

答案 1 :(得分:0)

如果函数searchUnguided()找到除none之外的答案,则它会从其自己的本地FOR循环中跳出。它不会从while循环中突破。运行代码时,第2行检查天空=='无',如果是,则继续运行。在第3行,假设天空正在改变,它没有任何检查(记住,检查在第2行)。因此,其余的代码在第6行的中断之前运行。

我可能会做这样的事情:

sky = "none"
while sky == "none":
    sky = searchUnguided(inframe, skysearch, debug=debug)
    if sky != "none":
        break
    sky = searchPQ(ad, skysearch, maxpq, debug=debug)
    if sky != "none":
        break
    sky = searchAB(ad, maxpq, debug=debug)
    break

可能有更好的答案,但这会奏效。

答案 2 :(得分:0)

这一行:     而天空=="无": 只有在每次循环后才会检查while循环条件。因此,在这种情况下,所有函数都将在下一次检查条件之前执行。但是,由于休息; while循环无论如何都会被终止。这使得while循环只是常规if条件的重写版本。

答案 3 :(得分:0)

我认为您对while循环的作用的理解是不正确的。循环条件仅在循环的顶部进行检查,因此,在调用searchUnguided之前检查一次,并且再也不会(因为在最后一次调用之后有break语句)。它没有在函数调用之间进行测试。

我认为你想要的是这样的:

sky = searchUnguided(searchUnguided(inframe, skysearch, debug=debug)
if sky == "none":
    sky = searchPQ(ad, skysearch, maxpq, debug=debug)
    if sky == "none":
        sky = searchAB(ad, maxpq, debug=debug)
        # you may want another "if" here to do something else if sky is still "none"