如何在Python中获得布尔值的相反(否定)?

amy*_*sin 72 python boolean

对于以下示例:

def fuctionName(int, bool):
    if int in range(...):
        if bool == True:
            return False
        else:
            return True
Run Code Online (Sandbox Code Playgroud)

有没有办法跳过第二个if语句?只是告诉计算机返回布尔值的反面bool

jtb*_*des 129

你可以使用:

return not bool
Run Code Online (Sandbox Code Playgroud)

  • 另外,`int in range(....)`是低效的.它将创建一个列表,然后执行线性搜索.优于'x in range(low,high)`是'low <= x <high`. (4认同)
  • @Neil G:不,我认为它在Python 3中应该没问题,但是由于上面的代码可能是其中之一,因此谨慎行事更安全.:-) (2认同)
  • @amyassin:MRAB意味着`low <= x <high`优于`x in range(low,high)`.`int in range(....)`应该表示与`x in range(low,high)`相同的东西. (2认同)

MSe*_*ert 24

not操作者(逻辑否定)

可能最好的方法是使用运算符not:

>>> value = True
>>> not value
False

>>> value = False
>>> not value
True
Run Code Online (Sandbox Code Playgroud)

而不是你的代码:

if bool == True:
    return False
else:
    return True
Run Code Online (Sandbox Code Playgroud)

你可以使用:

return not bool
Run Code Online (Sandbox Code Playgroud)

作为函数的逻辑否定

operator模块中还有两个函数,operator.not_它是别名operator.__not__,以防您需要它作为函数而不是运算符:

>>> import operator
>>> operator.not_(False)
True
>>> operator.not_(True)
False
Run Code Online (Sandbox Code Playgroud)

如果要使用需要谓词函数或回调的函数,这些函数非常有用.

例如mapfilter:

>>> lst = [True, False, True, False]
>>> list(map(operator.not_, lst))
[False, True, False, True]

>>> lst = [True, False, True, False]
>>> list(filter(operator.not_, lst))
[False, False]
Run Code Online (Sandbox Code Playgroud)

当然,使用等效lambda功能也可以实现同样的目的:

>>> my_not_function = lambda item: not item

>>> list(map(my_not_function, lst))
[False, True, False, True]
Run Code Online (Sandbox Code Playgroud)

不要~在布尔值上使用按位反转运算符

人们可能会试图使用按位反转运算符~或等效运算符函数operator.inv(或其中3个别名之一).但因为它boolint结果的子类可能是意外的,因为它不返回"反向布尔",它返回"反向整数":

>>> ~True
-2
>>> ~False
-1
Run Code Online (Sandbox Code Playgroud)

这是因为True相当于1False0和位反转上的按位表示操作整数 10.

所以这些不能用来"否定"a bool.

使用NumPy数组(和子类)否定

如果你正在使用NumPy的阵列处理(或类似的子类pandas.Seriespandas.DataFrame)含有布尔值,你可以实际使用的按位逆算子(~)来否定所有的数组中的布尔值:

>>> import numpy as np
>>> arr = np.array([True, False, True, False])
>>> ~arr
array([False,  True, False,  True])
Run Code Online (Sandbox Code Playgroud)

或等效的NumPy函数:

>>> np.bitwise_not(arr)
array([False,  True, False,  True])
Run Code Online (Sandbox Code Playgroud)

你不能在NumPy数组上使用not运算符或operator.not函数,因为它们要求它们返回单个bool(不是布尔数组),但是NumPy还包含一个逻辑非函数,它在元素方面有效:

>>> np.logical_not(arr)
array([False,  True, False,  True])
Run Code Online (Sandbox Code Playgroud)

这也可以应用于非布尔数组:

>>> arr = np.array([0, 1, 2, 0])
>>> np.logical_not(arr)
array([ True, False, False,  True])
Run Code Online (Sandbox Code Playgroud)

自定义您自己的类

not通过调用bool值并取消结果来工作.在最简单的情况下,真值将只调用__bool__对象.

因此,通过实现__bool__(或__nonzero__在Python 2中),您可以自定义真值,从而得到以下结果not:

class Test(object):
    def __init__(self, value):
        self._value = value

    def __bool__(self):
        print('__bool__ called on {!r}'.format(self))
        return bool(self._value)

    __nonzero__ = __bool__  # Python 2 compatibility

    def __repr__(self):
        return '{self.__class__.__name__}({self._value!r})'.format(self=self)
Run Code Online (Sandbox Code Playgroud)

我添加了一个print声明,因此您可以验证它是否真的调用了该方法:

>>> a = Test(10)
>>> not a
__bool__ called on Test(10)
False
Run Code Online (Sandbox Code Playgroud)

同样,您可以实现该__invert__方法以在~应用时实现该行为:

class Test(object):
    def __init__(self, value):
        self._value = value

    def __invert__(self):
        print('__invert__ called on {!r}'.format(self))
        return not self._value

    def __repr__(self):
        return '{self.__class__.__name__}({self._value!r})'.format(self=self)
Run Code Online (Sandbox Code Playgroud)

再次通过print调用看到它实际上被调用:

>>> a = Test(True)
>>> ~a
__invert__ called on Test(True)
False

>>> a = Test(False)
>>> ~a
__invert__ called on Test(False)
True
Run Code Online (Sandbox Code Playgroud)

然而,这样的实现__invert__可能会令人困惑,因为它的行为与"普通"Python行为不同.如果您这样做,请清楚地记录它并确保它具有非常好(和常见)的用例.


Pat*_*k87 9

Python有一个"not"运算符,对吧?这不只是"不"吗?如,

  return not bool
Run Code Online (Sandbox Code Playgroud)


小智 6

这里接受的答案对于给定的场景来说是最正确的。

这让我想知道如何简单地反转布尔值。事实证明,这里接受的解决方案可以作为一个内衬,并且还有另一个内衬也可以工作。假设您有一个已知为布尔值的变量“n”,则反转它的最简单方法是:

n = n is False
Run Code Online (Sandbox Code Playgroud)

这是我最初的解决方案,然后是这个问题所接受的答案:

n = not n
Run Code Online (Sandbox Code Playgroud)

后者更清晰,但我想知道性能并把它搞清楚了timeit- 事实证明,这n = not n也是反转布尔值的更快方法。