在Python中使用AND和NOT运算符
这是我自己写的一个类,用来表示一个三角形。我想写一段代码来检查 self.a
、self.b
和 self.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中,这个叫做 and
和 or
。
23
使用关键字 and
,而不是 &
,因为 &
是一个位运算符。
要小心这一点……让你知道,在 Java 和 C++ 中,&
运算符也是一个位运算符。在这些语言中,进行布尔比较的正确方式是 &&
。同样,|
是位运算符,而 ||
是布尔运算符。在 Python 中,and
和 or
用于布尔比较。
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的风格,从而让程序员更开心(还可能减肥、改善性生活等等)在大型程序中。