如何在Python中使用布尔运算符“and”

51

在C#中,我们可以像这样使用 &&(布尔逻辑与):

int i = 5;
int ii = 10;
if(i == 5 && ii == 10) {
    Console.WriteLine("i is 5, and ii is 10");
}
Console.ReadKey(true);

但是尝试使用Python:

i = 5
ii = 10
if i == 5 && ii == 10:
    print "i is 5 and ii is 10";      

我遇到了错误:SyntaxError: invalid syntax

如果我只使用一个 &,至少就不会出现语法错误。在Python中如何执行逻辑运算的 &&

6个回答

76

尝试这个:

i = 5
ii = 10
if i == 5 and ii == 10:
      print "i is 5 and ii is 10"

编辑:哦,还有最后一行不需要那个分号(编辑以从我的代码中删除它)。


分号非常有用,如果我们想要组合多行代码。 - riza
1
合并行不是“Pythonic”的方式。 - Rodrigo
1
虽然你可以像Rodrigo所说的那样合并行,但这并不是“Pythonic”的。由于在这种特定情况下分号根本没有任何作用,我对其冗余性进行了评论。我假设提问者是Python新手,并且不想让我的答案变得臃肿,因此没有详细解释什么是“Pythonic”和分号的作用。 - Mizipzor

29

如先前所指出的,在Python中,"&"执行按位与操作,就像在C#中一样。 "and"是"&&"运算符的适当等价物。

由于我们正在处理布尔值(i == 5True,并且 ii == 10 也是 True),您可能会想知道为什么这样做不起作用(将True视为整数数量应该仍然意味着 True & True 是一个True值),或者抛出异常(例如,禁止对布尔类型进行按位操作)。

原因是运算符优先级。"and"运算符比 == 结合得更松散,因此表达式:"i==5 and ii==10" 等效于:"(i==5) and (ii==10)"。

但是,按位 & 的优先级高于 "==" (因为您不希望像"a & 0xff == ch"这样的表达式被解释为 "a & (0xff == ch)"),因此该表达式实际上将被解释为:

if i == (5 & ii) == 10:

这是使用 Python 的操作符链来表示:ii 和 5 的按位与值是否等于 i 和 10。显然,这永远不会成立。

如果你加上括号改变运算顺序,你就能得到(看似)正确的答案:

if (i==5) & (ii=10)

这将导致该语句被打印出来。然而,这是错误的做法 - "&" 和 "and" 有许多不同的语义 -(优先级、短路、整数参数行为等),所以很幸运你在这里发现了它,而不是被愚弄到产生不太明显的错误。


16

正确的运算符是关键字'or'和'and',在您的示例中,表达式的正确方式为:

if i == 5 and ii == 10:
    print "i is 5 and ii is 10"

您可以在语言参考文档的“布尔运算”部分中了解详细信息。


每当我看到 and,我就会寻找我的括号。 - Mawg says reinstate Monica

7
你也可以把它们作为一对进行测试。
if (i,ii)==(5,10):
    print "i is 5 and ii is 10"

1
我内心挑剔的一面希望指出,你应该说“元组”而不是“couple”,但我知道你的意思。 :) - Andrew Hare
一对夫妇不是元组? - fulmicoton

6
在Python中,使用and而不是&&,例如:
#!/usr/bin/python
foo = True;
bar = True;
if foo and bar:
    print "both are true";

这将打印:

both are true

1
更准确地说,我们将“&&”拼写为“and”。 在C#和Python中,我们将“&”拼写为“&”,因为这些语言中它们执行按位而非逻辑与操作。 - Brian
1
当然,你是正确的。抱歉。 - Tim Ottinger

6

& 用于位运算比较。使用 and 替代。另外,你不需要在打印语句的结尾处使用分号。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接