2014-10-30 108 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是不是一個壞的要走的路