Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中获得布尔值的相反(否定)?_Python_Boolean - Fatal编程技术网

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

如何在Python中获得布尔值的相反(否定)?,python,boolean,Python,Boolean,对于以下示例: def fuctionName(int, bool): if int in range(...): if bool == True: return False else: return True 有没有办法跳过第二个if语句?要告诉计算机返回布尔值的相反值,您可以使用: return not bool Python有一个“not”操作符,对吗?不只是“不”吗?如: 您可以只比较布尔数组。比

对于以下示例:

def fuctionName(int, bool):
    if int in range(...):
        if bool == True:
            return False
        else:
            return True
有没有办法跳过第二个if语句?要告诉计算机返回布尔值的相反值,您可以使用:

return not bool
Python有一个“not”操作符,对吗?不只是“不”吗?如:


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

X = [True, False, True]
然后

我会给你

Y = [False, True, False]

如果您试图实现一个切换,以便在任何时候重新运行一个被否定的持久性代码,您可以通过以下方式实现:

try:
    toggle = not toggle
except NameError:
    toggle = True
运行此代码将首先将
切换设置为
True
,并且无论何时调用此代码段,切换都将被否定。

最好的方法可能是使用操作符
而不是

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

>>> value = False
>>> not value
True
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)
因此,不要使用代码:

if bool == True:
    return False
else:
    return True
您可以使用:

return not bool
作为函数的逻辑否定 模块中还有两个函数及其别名,以防您需要它作为函数而不是运算符:

>>> import operator
>>> operator.not_(False)
True
>>> operator.not_(True)
False
如果要使用需要谓词函数或回调的函数,这些函数可能非常有用

例如:

当然,也可以通过等效的
lambda
功能实现这一点:

>>> my_not_function = lambda item: not item

>>> list(map(my_not_function, lst))
[False, True, False, True]
>>> np.bitwise_not(arr)
array([False,  True, False,  True])
不要在布尔型上使用位反转运算符
~
可能会尝试使用按位反转运算符
~
或等效运算符函数(或其他3个别名中的一个)。但是由于
bool
int
的一个子类,因此结果可能是意外的,因为它不返回“逆布尔值”,而是返回“逆整数”:

这是因为
True
相当于
1
False
相当于
0
,而位反转操作是对整数的位表示进行的

因此,这些不能用于“否定”一个
bool

使用NumPy数组(和子类)求反 如果您处理的是包含布尔值的NumPy数组(或子类,如
pandas.Series
pandas.DataFrame
),您实际上可以使用位逆运算符(
~
)对数组中的所有布尔值求反:

>>> import numpy as np
>>> arr = np.array([True, False, True, False])
>>> ~arr
array([False,  True, False,  True])
或等效的NumPy函数:

>>> my_not_function = lambda item: not item

>>> list(map(my_not_function, lst))
[False, True, False, True]
>>> np.bitwise_not(arr)
array([False,  True, False,  True])
不能在NumPy数组上使用
not
运算符或
运算符.not
函数,因为它们需要返回单个
bool
(不是布尔数组),但是NumPy还包含一个逻辑not函数,该函数可按元素工作:

>>> 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
通过对值调用
bool
并对结果求反来工作。在最简单的情况下,只需对对象调用
\uuuubool\uuuu

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

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

>>> value = False
>>> not value
True
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
语句,以便您可以验证它是否真的调用了该方法:

>>> 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

然而,像那样实现
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
可能会令人困惑,因为它的行为不同于“正常”的Python行为。如果您曾经这样做过,请清楚地记录它,并确保它有一个非常好的(和常见的)用例。

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

这让我想知道,一般来说,简单地反转一个布尔值。事实证明,这里被接受的解决方案就像一个线性程序一样有效,还有另一个线性程序同样有效。假设您有一个已知为布尔值的变量“n”,最简单的反转方法是:

n = n is False
这是我最初的解决方案,然后是这个问题的公认答案:

n = not n

后者更为清晰,但我想知道性能,并通过
timeit
对其进行了分析,结果表明,在
n=not n
处反转布尔值也是一种更快的方法。

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

正如mousetail建议的那样:

bool(1 - False)

bool(1 - True)

我认为最紧凑的版本是

self.foobar^=True

它不需要重复整个名称,并且适用于纯布尔值。

Python具有运算符来反转布尔值

示例:

如果要反转返回语句中的值,请使用下面的代码

return not bool
key = not bool
如果要反转If条件中的值,请使用如下代码

if not bool:
    return True
else:
    return False
check(not bool)
如果要在将值传递到方法级别时反转该值,请使用如下代码

if not bool:
    return True
else:
    return False
check(not bool)
如果在赋值时要反转该值,请使用如下代码

return not bool
key = not bool

这可能只是伪代码,但
int
bool
都是内置名称(对于它们所表示的类型),不应用作变量名。是的,它只是一个伪代码,仅用于演示…
如果x==True:
应编写
如果x:
。此外,
范围内的int(…)
效率低下。它将创建一个列表,然后执行线性搜索。在范围(低、高)上优于
x
low请注意
非None
将返回False。至少对我来说,这不是我所期望的。我希望
notnone
None
,因此即使返回值可能是
None
,也可以使用
not
进行否定。在Python中实现它的方式是,你必须首先验证你是否得到了一个布尔值。我想我需要提到@MRAB提到的
int-in-range(…)
只有在Python 3之前是无效的,因为除非你通过
list(…)运行
range(…)
,否则它使用的是m