以下示例:
def fuctionName(int, bool):
if int in range(...):
if bool == True:
return False
else:
return True
有没有办法跳过第二个if语句?只是告诉计算机返回布尔值bool
的反面?
答案 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
如果您要使用需要谓词功能或回调的功能,这些功能将很有用。
>>> 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个别名之一)。但是因为bool
是int
的子类,所以结果可能是意外的,因为它没有返回“反布尔”,而是返回了“反整数”:
>>> ~True
-2
>>> ~False
-1
这是因为True
等效于1
,而False
等效于0
,而按位求反则对整数 {{ 1}}和1
。
因此这些不能用于“否定” 0
。
如果您要处理包含布尔值的NumPy数组(或类似bool
或pandas.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]