在Python中使用AND和NOT运算符

这是我的自定义类,代表一个三angular形。 我试图编写代码来检查self.aself.bself.c是否大于0,这意味着我有angular度,angular度,angular度。

下面你会看到检查A和B的代码,但是当我使用self.a != 0它工作正常。 我相信我没有正确使用。 有任何想法吗? 这是我如何调用它: print myTri.detType()

 class Triangle: # Angle A To Angle C Connects Side F # Angle C to Angle B Connects Side D # Angle B to Angle A Connects Side E def __init__(self, a, b, c, d, e, f): self.a = a self.b = b self.c = c self.d = d self.e = e self.f = f def detType(self): #Triangle Type AAA if self.a != 0 & self.b != 0: return self.a #If self.a > 10: #return AAA #Triangle Type AAS #elif self.a = 0: #return AAS #Triangle Type ASA #Triangle Type SAS #Triangle Type SSS #else: #return unknown 

你应该写:

 if (self.a != 0) and (self.b != 0) : 

& ”是位运算符,不适合布尔操作。 Python中的“ && ”等价于“and”。

一个简短的方法来检查你想要的是使用“in”运算符:

 if 0 not in (self.a, self.b) : 

你可以用“in”来检查是否有任何东西是可迭代的,它适用于:

  • 元组。 IE: "foo" in ("foo", 1, c, etc)将返回true
  • 列表。 IE: "foo" in ["foo", 1, c, etc]将返回true
  • string。 IE: "a" in "ago"将返回true
  • 快译通。 IE: "foo" in {"foo" : "bar"}将返回true

作为对这些评论的回答:

是的,使用“in”比较慢,因为你正在创build一个Tuple对象,但是真正的性能在这里不是什么问题,再加上可读性在Python中很重要。

对于三angular形检查,读起来更容易:

 0 not in (self.a, self.b, self.c) 

 (self.a != 0) and (self.b != 0) and (self.c != 0) 

重构也比较容易。

当然,在这个例子中,它确实不是那么重要,它是非常简单的代码片段。 但是这种风格导致了一个Pythonic代码,这导致了大程序中更快乐的程序员(以及减肥,改善性生活等等)。

使用关键字,而不是因为&是一个位运算符。

要小心这个…只要你知道,在Java和C ++中, &运算符也是一个运算符。 在这些语言中进行布尔比较的正确方法是&& 。 同样| 是一个位运算符, || 是一个布尔运算符。 在Python andor用于布尔比较。

它被称为and or在Python中。