2015-05-29 39 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_,他们都被评估。 –