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

时间:2011-08-11 18:15:36

标签: python boolean

以下示例:

def fuctionName(int, bool):
    if int in range(...):
        if bool == True:
            return False
        else:
            return True

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

9 个答案:

答案 0 :(得分:114)

你可以使用:

return not bool

答案 1 :(得分:15)

not operator(逻辑否定)

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

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

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

因此,而不是您的代码:

if bool == True:
    return False
else:
    return True

您可以使用:

return not bool

作为函数的逻辑求反

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

>>> import operator
>>> operator.not_(False)
True
>>> operator.not_(True)
False

如果您要使用需要谓词功能或回调的功能,这些功能将很有用。

例如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]

当然,也可以使用等效的lambda函数来实现相同的目的:

>>> my_not_function = lambda item: not item

>>> list(map(my_not_function, lst))
[False, True, False, True]

请勿在布尔值上使用按位取反运算符~

可能会尝试使用按位取反运算符~或等效的运算符函数operator.inv(或那里的其他3个别名之一)。但是因为boolint的子类,所以结果可能是意外的,因为它没有返回“反布尔”,而是返回了“反整数”:

>>> ~True
-2
>>> ~False
-1

这是因为True等效于1,而False等效于0,而按位求反则对整数 {{ 1}}和1

因此这些不能用于“否定” 0

使用NumPy数组(和子类)求反

如果您要处理包含布尔值的NumPy数组(或类似boolpandas.Series的子类),则实际上可以使用按位逆运算符(pandas.DataFrame)求反 all 数组中的布尔值:

~

或等效的NumPy函数:

>>> import numpy as np
>>> arr = np.array([True, False, True, False])
>>> ~arr
array([False,  True, False,  True])

您不能在NumPy数组上使用>>> np.bitwise_not(arr) array([False, True, False, True]) 运算符或not函数,因为它们要求这些返回单个operator.not(不是布尔数组),但是NumPy也包含一个逻辑不起作用的元素:

bool

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

>>> np.logical_not(arr)
array([False,  True, False,  True])

自定义自己的课程

>>> arr = np.array([0, 1, 2, 0]) >>> np.logical_not(arr) array([ True, False, False, True]) 通过在值上调用not并取反结果来工作。在最简单的情况下,truth value只会在对象上调用bool

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

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) 语句,以便您可以验证它是否真正调用了该方法:

print

同样,您可以实现__invert__方法来实现应用>>> a = Test(10) >>> not a __bool__ called on Test(10) False 时的行为:

~

再次调用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) 来查看它实际上是否被调用:

print

但是像这样实现>>> a = Test(True) >>> ~a __invert__ called on Test(True) False >>> a = Test(False) >>> ~a __invert__ called on Test(False) True 可能会造成混淆,因为它的行为不同于“正常”的Python行为。如果您这样做的话,请清楚地记录下来,并确保它有一个很好的(和常见的)用例。

答案 2 :(得分:9)

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

  return not bool

答案 3 :(得分:2)

如果您正在尝试实施切换,那么无论何时重新运行持久代码都会被忽略,您可以按照以下方式实现:

try:
    toggle = not toggle
except NameError:
    toggle = True

运行此代码将首先将toggle设置为True,并且无论何时调用此代码段,切换都将被取消。

答案 4 :(得分:2)

对于给定方案,此处可接受的答案是最正确的。

这让我想知道一般而言只是简单地反转一个布尔值。事实证明,这里公认的解决方案可以用作一种衬板,而另一种衬板也可以使用。假设您知道一个变量“ n”是布尔值,那么将其取反的最简单方法是:

n = n is False

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

n = not n

后者更清晰,但是我想知道性能,并通过timeit对其进行了修饰-事实证明,n = not n也是反转布尔值的更快方法。

答案 5 :(得分:0)

另一种实现相同结果的方法,我发现这对熊猫数据框很有用。

如下面的鼠标尾所示:

bool(1 - False)

bool(1 - True)

答案 6 :(得分:0)

我认为最紧凑的版本是

<块引用>

self.foobar ^= 真

不需要重复整个名称并且可以使用纯布尔值。

答案 7 :(得分:0)

Python 有 not 运算符来反转布尔值。

示例:

如果您想反转return 语句中的值,请使用如下代码。

return not bool

如果您想反转if条件中的值,请使用如下代码

if not bool:
    return True
else:
    return False

如果您想在将值传递给方法级别时反转该值,请使用如下代码

check(not bool)

如果您想在赋值时反转该值,请使用如下代码。

key = not bool

答案 8 :(得分:-1)

您可以只比较布尔数组。例如

X = [True, False, True]

然后

Y = X == False

会给你

Y = [False, True, False]