在Python中使用AND和NOT运算符

时间:2009-07-02 17:22:45

标签: python operators

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

下面你会看到检查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

3 个答案:

答案 0 :(得分:116)

你应该写:

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

&”是位运算符,不适合布尔运算。 “&&”的等价物在Python中是“和”。

检查所需内容的较短方法是使用“in”运算符:

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

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

  • 元组。 I.E:"foo" in ("foo", 1, c, etc)将返回true
  • 解释。 I.E:"foo" in ["foo", 1, c, etc]将返回true
  • 字符串。 I.E:"a" in "ago"将返回true
  • 字典。 I.E:"foo" in {"foo" : "bar"}将返回true

作为评论的答案:

是的,因为你正在创建一个Tuple对象,所以使用“in”会慢一些,但实际上这里的表演不是问题,而且可读性在Python中很重要。

对于三角形检查,它更容易阅读:

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

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

重构也更容易。

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

答案 1 :(得分:21)

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

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

答案 2 :(得分:11)

在Python中称为andor