在Python中使用AND和NOT运算符
这是我的自定义类,代表一个三angular形。 我试图编写代码来检查self.a
, self.b
和self.c
是否大于0,这意味着我有angular度,angular度,angular度。
下面你会看到检查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
你应该写:
if (self.a != 0) and (self.b != 0) :
“ &
”是位运算符,不适合布尔操作。 Python中的“ &&
”等价于“and”。
一个简短的方法来检查你想要的是使用“in”运算符:
if 0 not in (self.a, self.b) :
你可以用“in”来检查是否有任何东西是可迭代的,它适用于:
- 元组。 IE:
"foo" in ("foo", 1, c, etc)
将返回true - 列表。 IE:
"foo" in ["foo", 1, c, etc]
将返回true - string。 IE:
"a" in "ago"
将返回true - 快译通。 IE:
"foo" in {"foo" : "bar"}
将返回true
作为对这些评论的回答:
是的,使用“in”比较慢,因为你正在创build一个Tuple对象,但是真正的性能在这里不是什么问题,再加上可读性在Python中很重要。
对于三angular形检查,读起来更容易:
0 not in (self.a, self.b, self.c)
比
(self.a != 0) and (self.b != 0) and (self.c != 0)
重构也比较容易。
当然,在这个例子中,它确实不是那么重要,它是非常简单的代码片段。 但是这种风格导致了一个Pythonic代码,这导致了大程序中更快乐的程序员(以及减肥,改善性生活等等)。
使用关键字,而不是因为&
是一个位运算符。
要小心这个…只要你知道,在Java和C ++中, &
运算符也是一个运算符。 在这些语言中进行布尔比较的正确方法是&&
。 同样|
是一个位运算符, ||
是一个布尔运算符。 在Python and
和or
用于布尔比较。
它被称为and
or
在Python中。