【问题标题】:Using the AND and NOT Operator in Python [duplicate]在 Python 中使用 AND 和 NOT 运算符 [重复]
【发布时间】:2010-11-07 17:17:13
【问题描述】:

这是我的自定义类,它代表一个三角形。我正在尝试编写代码来检查self.aself.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

【问题讨论】:

    标签: python operators


    【解决方案1】:

    你应该写:

    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
    • 字符串。 IE:"a" in "ago" 将返回 true
    • 字典。 IE:"foo" in {"foo" : "bar"} 将返回 true

    作为对 cme​​ts 的回答:

    是的,使用“in”会比较慢,因为您正在创建一个 Tuple 对象,但这里的性能真的不是问题,而且 Python 中的可读性很重要。

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

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

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

    重构也更容易。

    当然,在这个例子中,它真的不是那么重要,它非常简单的sn-p。但是这种风格导致了 Pythonic 代码,这导致程序员在大型程序上更快乐(以及减肥、改善性生活等)。

    【讨论】:

    • 为什么“if 0 not in (self.a, self.b):”更短?那真的是惯用的python吗?是的,它缩短了几个字符,但可能更慢。你必须构造一个元组,它看起来很尴尬。
    • 处理这么少量数据的速度不是问题。无论如何,在 Python 中,可读性通常比速度更重要。在这种情况下,它非常有用,因为如果你想检查 3 个角度,这样写比用 3 个“and”更简洁。
    • 通常在左边是可变的时候使用,比如:if x in (2, 3, 5, 7) ...
    • 我不会争论,我只是说个人口味,我认为这不是pythonic。我更倾向于同意 FogleBird 的观点。无论如何......这是正确的:-)。
    • @Heikki: 如果元组是一个 CONSTANT 例如"a in (1, 7, 15)" 那么它有可能更快,因为元组是在编译时评估的;但是,在 (vbl0, vbl1, vbl2) 中像 OP 的 0 这样的情况下,它不太可能更快并且看起来很丑。
    【解决方案2】:

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

    注意这个...只是让您知道,在 Java 和 C++ 中,& 运算符也是位运算符。在这些语言中进行布尔比较的正确方法是&&。同样| 是位运算符,|| 是布尔运算符。在 Python 中,andor 用于布尔比较。

    【讨论】:

    • 您也可以在 标准(即非 Microsoft;-)C++ 中使用 and 代替 &&
    • 哇!我真的不知道你能做到这一点,亚历克斯。我问了一些非常精通 C++ 的朋友,他们也不知道!而且网上也不容易找。但果然,我试过了,它奏效了:-)。谢谢!
    【解决方案3】:

    在 Python 中称为 andor

    【讨论】:

      猜你喜欢
      • 2017-07-29
      • 2013-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-10
      • 2013-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多