我想成为" 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
这些功能searchUnguided
,searchPQ
和searchAB
中的每一项都会返回一个值,默认情况下为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
语句,但这看起来很啰嗦......
提前致谢!
答案 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"