Using the AND and NOT Operator in Python
这是我的自定义类,它代表一个三角形。我试图编写代码来检查self.a、self.b和self.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代码,这导致一个更快乐的程序员(减肥,改善性生活等)在大的程序。
- 为什么"如果0不在(self.a,self.b):"更短?那真的是惯用的Python吗?是的,它短了几个字符,但可能慢了一些。你必须构造一个元组,它看起来很尴尬。
- 在如此少量的数据上加快速度不是问题。无论如何,可读性通常比Python中的速度更重要。在这种情况下,它非常有用,因为如果你想检查三个角度,用这种方式写比用3"和"更干净。
- 通常在左手边可变时使用,例如:如果x in(2,3,5,7)……
- 我不想争辩,我只是想说,作为个人品味的问题,我认为那是较少的Python。我更倾向于同意福格勒伯德的观点。不管…正确:—)。
- 我最近将"in"性能与布尔运算符进行了比较,发现"in"获胜的情况有:heikkitoivonen.net/blog/2009/06/16/remember-your-in-operator
- "如果(自己)!=0)和(self.b!=0):":aarrgghh!不是帕斯卡!第一次提炼:"如果自己。A!=0和self.b!=0;如果self.a和self.b:
- @Heikki:如果tuple是一个常量,例如"a in(1,7,15)",那么它就有可能更快,因为tuple是在编译时计算的;但是在像op's 0 in(vbl0,vbl1,vbl2)这样的情况下,它不太可能更快,看起来很模糊。
- @约翰。不。我们在处理数学。我们希望0到ba考虑在内,但不是"假"。你不能移除!=
- @E-satis:不是。是的,我们处理的是数学,特别是一个三角形的边和角是浮点数(或整数)。在没有任何字符串、没有任何垃圾或其他垃圾的情况下,if x的含义与if x != 0完全相同。如果您担心垃圾,那么应该在开始检查多属性条件之前对其进行检查。
- 这意味着类型检查,这是我们在Python中不希望看到的。我们也不想放二传手。我认为使用tuple方法是一个很好的双赢协议,考虑到"python不是pascal",但不会用检查来重载代码。
- @E-satis:你的元组对你没有帮助。0不在(rubbish1,rubbish2)…垃圾!=0和rubbish2!= 0…Rubbish1和Rubbish2…答案都是垃圾。如果没有垃圾,这三种形式是等价的。
- 你不需要无礼,伙计。
- @E-satis:没错,我也不粗鲁。我使用"垃圾"的意义与"gigo"中的"垃圾"(垃圾输入,垃圾输出)相同。垃圾在字符串中,没有,等等。垃圾在没有意义的结果中。我也不提倡类型检查和/或设置器。在init方法中使用self.a = float(a)而不是self.a = a,您感觉如何?
- 它肯定很干净。不管怎样,我不确定一个20个字符长的条件声明是否值得如此多的讨论:—)
- 我们能不能都同意使用in是一种可怕的风格,更不可读?这种代码高尔夫在我嘴里留下一种干燥的感觉。
- ``但这种风格导致了一个Python代码,这导致了一个更快乐的程序员(减肥,改善性生活等)在大程序上。
使用关键字and,而不是&,因为&是位运算符。
小心点……正如你所知道的,在Java和C++中,EDCOX1×1的运算符也是位运算符。在这些语言中进行布尔比较的正确方法是&&。同样,|是位运算符,||是布尔运算符。在python中,and和or用于布尔比较。
- 您还可以使用EDOCX1×0代替标准中的EDCOX1×1×(即,非微软;-)C++。
- 真的!我真的不知道你能做到,亚历克斯。我问了一些我的C++聪明朋友,他们也不知道!而且在网上也不容易找到。但我确实试过了,而且效果很好。谢谢!
在python中称为and和or。