2016-05-12 479 views
0

我還是比較新的Python和使用都像報表中的以下內容:「while True」循環的替代語法?

flag = False 
while flag == False: 
    # Do something here that might set the flag to True, 
    flag = True 

然而,這個可以寫像這樣:

while not flag: 
    # Do something... 
    flag = True 
while flag is False: 
    # Do something... 
    flag = True 

隨着進一步的(首選?)的方式寫這種類型的循環:

while True: 
    # Do something and if wanting wanting to break out of loop, 
    break 

前三種方法更明確,那麼爲什麼他們(或其中之一)不優於第四種方法?前三種寫作「while flag == False」的方式有什麼不同嗎?

+1

如果你想使你的意圖在while循環的條件明確,我想創建一個'didnt_break_yet =拉姆達:TRUE'和使用它像'而didnt_break_yet():#做something'。通過這種方式,您可以清楚地知道,循環*無意運行無限長* – WorldSEnder

+0

如果您有多個選項可供選擇,無論您的個人偏好是什麼,都可以使用代碼上下文中的任何作品。 –

回答

-1

所有這些在技術上都是不同的。

例1

假設你有一個函數調用不返回任何有意義的東西,如下:

def fun(x=None): 
    return x 

現在,爲你的while循環,所有這些都將被定義爲如下:

def while1(): 
    flag = False 
    while flag == False: 
     flag = fun(None) 

def while2(): 
    flag = False 
    while flag is False: 
     flag = fun(None) 

def while3(): 
    flag = False 
    while not flag: 
     flag = fun(None) 

在這種情況下,只有while1while2將終止。由於bool(None)的計算結果爲False,因此while3將無限延續,但由於None != FalseNone is not Falsewhile1while2都將終止。

現在,通過更復雜的例子,這會變得更有趣。

例2

def fun(x): 
    return x 

現在,對於我們每一個循環的,我們要改變flag = fun()flag = fun(0)

在這種情況下,while1while3終止,而while2無限期地繼續。這是因爲bool(0) == False0 == False,但0 is not False

例3 - Mutables

現在,這得到了很多更加複雜與mutables,這就是爲什麼明確與隱含的依賴局面的情況。可變數是可以修改的任何對象,幷包括字典,列表。不可變的對象是任何不能被修改的東西,比如元組,浮點數,浮點數,strs。

說我有以下幾點:

a = [] 
b = [] 

在這種情況下,bool(a) == Falsea == b,但a is not b。簡而言之,如何檢查虛僞或真實的價值觀並不存在,簡單而堅定的規則。

但是,有一般規則。

通則

檢查無與其他來源 如果你接受比無其他任何值,檢查x is None

檢查mutables 切勿使用x is b,因爲mutables可以有不同的ID,除非你明確要檢查使用相同的ID(id(x) == id(b)的對象。 通常情況下,檢查not xx == b

>>> a = [] 
>>> b = [] 
>>> a is b 
False 
>>> a == b 
True 
>>> not a 
True 

檢查strs,浮動和整數 對於strs,浮動和整數,總是檢查x == b而不是x is b。這是因爲對於短strs,浮動,如果是x == b,結果可能爲真,但對於更復雜的情況,您的代碼將停止工作。

例如:

>>> a = 1 
>>> a is 1 
True 
>>> a = 10000000 
>>> a is 10000000 
False 

檢查布爾

對於布爾值,可以執行任何上述的,但not x優選x == bx is b

最後... While循環

如果可以的話,總是一個while循環轉換爲一個循環。這並不總是可能的,但說你想要做一個簡單的例子:

x = 0 
while x < 10: 
    print(x) 
    x -= 1 

這可以轉換爲:

for x in range(10): 
    print(x) 

之所以使用for循環而不是while循環是,如果某個錯誤發生在你的代碼中,while循環可能導致無限循環並導致你的程序崩潰,而for循環總是會退出。

+0

匿名downvoter,有何評論? –

+0

這是一個非常有幫助的答案,謝謝!我想對於我的任何電流應用,我可以繼續使用任何方法爲'flag'只會被設置爲TRUE;或'FALSE',但基本上使用'而TRUE'避免了所產生的這些問題,對不對? – Lotte

+0

@Lotte,是的。 '而真'是一個很好的聲明,直到一個條件被設置。如果可以,請將while循環轉換爲for循環,但如果您需要將代碼卷積到循環中,while循環存在的原因很充分。 –

0

我不認爲真的有偏好。只要指定的布爾表達式保持爲真,while循環將繼續執行代碼塊。

flag == True,not Flag,i < 6或評估爲布爾表達式。如果你只是像你的例子那樣說True,那麼你只會進入一個無限循環。這是否回答你的問題?

0

雖然前三個更明確,但最後一個更具可讀性和清晰性。我想說的是,這是其他三個選項的更大選項。將不會搜索循環中某些變量的初始化。就這樣說,所有的方法都是完全可以接受的,你應該使用一個更舒適的方法。

0

我認爲while True:語法適用於簡單的邏輯。一旦你開始從多個位置跳出循環或需要跟蹤循環是否成功,那麼它會變得混亂。

此外,如果while條件命名正確,那麼它會列出您爲什麼要循環的文檔。

while not end_of_file: 
    ..read read read.. 

避免循環中的break語句,恕我直言,使代碼更具可讀性。就像在函數中避免多個return語句一樣。

+0

我想問一下避免多個'return'語句的原因是什麼?這僅僅是爲了清楚嗎?我可能會對此感到內疚。 – Lotte

+0

@Lotte,爲清楚起見,也爲調試代碼更實際的原因。很高興有一個地方所有的代碼退出,所以你可以找出返回值。 – swdev