2015-05-29 74 views
0

我想在一個while循環使用and,但它似乎不能很好地工作。例如:使用「和」多次循環使用Python

while (A1==0) and (A2==0) and (A3==0) and (A4==0): 

有了這一個,它似乎結束對第一和第二and循環,而不是一味的所有條件滿足。這是錯誤的方式使用andwhile循環?

下面是代碼:

import random 
B1=0 
B2=0 
B3=0 
B4=0 
A = random.randrange(1,5) 
while all([B1==0, B2==0, B3==0, B4==0]): 
    if A != B1: 
     B1 = A 
     print(B1) 
    A = random.randrange(1,5) 
    if (A!= B2) and (A!= B1): 
     B2 = A 
     print(B2) 
    A = random.randrange(1,5) 
    if (A!= B3) and (A!= B2) and (A!= B1): 
     B3=A 
     print(B3) 
    A = random.randrange(1,5) 
    if (A!= B4) and (A!= B3) and (A!= B2) and (A!= B1): 
     B4=A 
     print(B4) 

我想打印在隨機順序1,2,3,4,但它通常會打印2或3其中。

+6

向我們展示你的代碼的其餘部分。 – jwodder

+6

在'和'中,如果第一個條件'A1 == 0'是假的,則不評估其他條件。你期望的行爲是什麼? – ZdaR

+1

某處A1,A2,A3或A4變成非零(或者你有一個break語句)......尋找那個 –

回答

3

儘管事實,什麼是短路(and在第一falsy結果停止評估),還有使用all寫這一個更簡潔的方式:

while all([A1 == 0, A2 == 0, A3 == 0, A4 == 0]): 
    # Work here 

雖然所有的值是在列表中產生的內容正在被評估(因此不是短路),all將在第一次虛假事件中返回False


既然你已經添加你使用的代碼,你的表情就會永遠不會在第二次迭代真正random.randrange(1, 5)only generate values between 1 and 5 exclusive。開始值降低到0,讓你有機會產生一個0


既然你已經明確你想要做什麼,那麼所有你需要做的僅僅是生成四個隨機值,並檢查它們是否與包含所需值的集合相匹配。

result = [] 
expected = {1, 2, 3, 4} 
while set(result) != expected: 
    # Surely there's a better method to generate this... 
    result = [random.randint(1, 4), random.randint(1, 4), 
       random.randint(1, 4), random.randint(1, 4)] 
print result 
+0

這是不一樣的,所有的表達式都將被評估,這違背了「短路」的本質。 –

+0

@JeffMercado:你有參考嗎? – Makoto

+0

您正在構建表達式值的列表。 _values_,他們都被評估。 –