Python“;而";循环未按预期结束

Python“;而";循环未按预期结束,python,while-loop,Python,While Loop,我试图在我的代码中使用“Python风格”,我试图依次调用三个函数,第二个函数只有在第一个函数不产生结果时才被调用,第三个函数只有在第一个和第二个函数不产生结果时才被调用 sky = "none" while sky == "none": sky = searchUnguided(inframe, skysearch, debug=debug) sky = searchPQ(ad, skysearch, maxpq, debug=debug) sky = searchAB

我试图在我的代码中使用“Python风格”,我试图依次调用三个函数,第二个函数只有在第一个函数不产生结果时才被调用,第三个函数只有在第一个和第二个函数不产生结果时才被调用

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
每个函数
searchUnguided
searchPQ
searchAB
都返回一个值,默认值为
none
,但可以更改为其他值。当sky==“none”循环时,我要停止的就是这些“其他”情况。然而,它并没有像我所期望的那样工作,即使第一个函数返回的不是
none
,所有三个函数都会被调用

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

我是否误解了
循环的工作方式?我总是可以使用嵌套的
if
语句,但这似乎太冗长了


提前谢谢

如果函数searchUnguided()找到的答案不是none,则它会从自己的局部FOR循环中断。它不会从while循环中中断。当代码运行时,第2行检查sky=='none',如果是,它将继续运行。在第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
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"
也许有更好的答案,但这会奏效。

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

在这种情况下,while循环将不起作用,因为它的第一次计算结果将为true,第二次计算结果将由于中断而不存在


看起来ifs是一种不错的方法

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

我想你想要的是这样的:

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
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"

你知道它会在前三个函数调用后中断吗?不,如果我删除
中断
它将永远运行。。。