在Python中使用AND和NOT运算符

Noa*_*ark 61 python operators

这是我的自定义类,它代表一个三角形.我正在尝试编写代码来检查是否self.a,self.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
Run Code Online (Sandbox Code Playgroud)

e-s*_*tis 123

你应该写:

if (self.a != 0) and (self.b != 0) :
Run Code Online (Sandbox Code Playgroud)

" &"是位运算符,不适合布尔运算.相当于" &&"在Python中是"和".

检查所需内容的更简单方法是使用"in"运算符:

if 0 not in (self.a, self.b) :
Run Code Online (Sandbox Code Playgroud)

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

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

作为评论的答案:

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

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

0 not in (self.a, self.b, self.c)
Run Code Online (Sandbox Code Playgroud)

(self.a != 0) and (self.b != 0) and (self.c != 0) 
Run Code Online (Sandbox Code Playgroud)

重构也更容易.

当然,在这个例子中,它确实不是那么重要,它是非常简单的片段.但这种风格导致了Python的代码,这导致了一个快乐的程序员(和减肥,提高性生活等)上大项目.

  • 这么一小块数据的速度不是问题.无论如何,readabilty通常比Python的速度更重要.在它的情况下,它是非常有用的,因为如果你想检查3个角度,用这种方式写它比用3"和"更清晰. (11认同)
  • 为什么"如果0不在(self.a,self.b):"更短?这真的是惯用的蟒蛇吗?是的,它会缩短几个字符,但可能会更慢.你必须构造一个元组,它看起来很尴尬. (8认同)
  • 通常在左侧可变时使用,例如:如果x在(2,3,5,7)...... (6认同)
  • @Heikki:如果元组是*CONSTANT*例如"a in(1,7,15)"那么它有可能更快,因为元组在编译时被评估; 然而,在像(vbl0,vbl1,vbl2)中的OP为0的情况下,它不太可能更快并且看起来很难看. (4认同)
  • 我不打算争辩,我只是想说个人品味,我认为这不是pythonic.我更倾向于同意FogleBird.无论如何......这是正确的:-). (3认同)

Tom*_*Tom 22

使用关键字and,不是&因为&有点操作符.

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

  • 您也可以在_standard_(即非Microsoft ;-) C++中使用`和`代替`&&`. (8认同)
  • 哇!亚历克斯,我真的不知道你能做到这一点.我问了一些非常精通C++的朋友,他们也不知道!此外,在线查找并不容易.但果然,我尝试了它并且它起作用了:-).谢谢! (3认同)

Len*_*bro 12

这就是所谓的andorPython编写的.