2014-10-30 41 views
-1

我想在我的代码中“Python-esque”,在那里我试图连续调用三个函数,第二个只在第一个函数不会调用时才被调用,吨产生结果,而第三个仅当所述第一和第二不...Python“while”循环没有按预期结束

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陈述,但似乎很啰嗦...

在此先感谢!

+1

你知道前三项功能后,它会破坏调用不管是什么? – 2014-10-30 01:19:13

+0

不,如果我删除了“break”它将永远运行... – mdhoney 2014-10-30 02:09:30

回答

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

如果函数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 

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

0

此行: while sky ==“none”: while循环条件将仅在每个循环之后进行检查。所以在这种情况下,所有功能都会在下一次检查条件发生之前执行。但是,由于休息;无论如何,while循环将被终止。这使得while循环只是一个常规if条件的重写版本。

1

while循环将在这种情况下没有任何影响,因为周围的第一时间将在评估为真,就没有评价第二次因破

看起来像IFS是不是一个坏的要走的路