在Python中使用AND和NOT运算符

Using the AND and NOT Operator in Python

本问题已经有最佳答案,请猛点这里访问。

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

下面您将看到检查a和b的代码,但是当我只使用self.a != 0时,它可以正常工作。我认为我没有正确使用&。有什么想法吗?我是这样称呼它的:print myTri.detType()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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

你应该写:

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

"&是位运算符,不适用于布尔运算。在python中,相当于"EDOCX1"(4)的是"and"。

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

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

您可以检查是否有任何内容是带有"in"的iterable的一部分,它适用于:

  • Tuples。即:"foo" in ("foo", 1, c, etc)返回真
  • 列表。即:"foo" in ["foo", 1, c, etc]返回真
  • 串。即:"a" in"ago"返回真
  • 口述即:"foo" in {"foo" :"bar"}将返回真

作为对评论的回答:

是的,使用"in"会比较慢,因为您正在创建一个tuple对象,但实际上性能不是这里的问题,而且可读性在Python中非常重要。

三角形检查更容易阅读:

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

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

重构也更容易。

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


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

小心点……正如你所知道的,在Java和C++中,EDCOX1×1的运算符也是位运算符。在这些语言中进行布尔比较的正确方法是&&。同样,|是位运算符,||是布尔运算符。在python中,andor用于布尔比较。


在python中称为andor