在Python中使用AND和NOT运算符

67 投票
3 回答
503468 浏览
提问于 2025-04-15 12:38

这是我自己写的一个类,用来表示一个三角形。我想写一段代码来检查 self.aself.bself.c 是否都大于0,如果都大于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 个回答

14

在Python中,这个叫做 andor

23

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

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

131

你应该写:

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

"&" 是位运算符,不适合用来做布尔运算。在Python中,"&&" 相当于 "and"。

检查你想要的东西有一个更简单的方法,就是用 "in" 操作符:

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

你可以用 "in" 来检查某个东西是否在一个可迭代对象里,它适用于:

  • 元组。例如:"foo" in ("foo", 1, c, etc) 会返回真
  • 列表。例如:"foo" in ["foo", 1, c, etc] 会返回真
  • 字符串。例如:"a" in "ago" 会返回真
  • 字典。例如:"foo" in {"foo" : "bar"} 会返回真

关于评论的回答:

是的,使用 "in" 会慢一些,因为你在创建一个元组对象,但其实性能在这里并不是问题,而且可读性在Python中非常重要。

对于三角形检查,这样写更容易理解:

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

比起:

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

这样重构也更简单。

当然,在这个例子中,这并不是特别重要,因为它只是一个非常简单的代码片段。但这种风格会让代码更符合Python的风格,从而让程序员更开心(还可能减肥、改善性生活等等)在大型程序中。

撰写回答