对于以下示例:
def fuctionName(int, bool):
if int in range(...):
if bool == True:
return False
else:
return True
有什么办法可以跳过第二个if语句?只是为了告诉计算机返回布尔值的相反值bool
?
对于以下示例:
def fuctionName(int, bool):
if int in range(...):
if bool == True:
return False
else:
return True
有什么办法可以跳过第二个if语句?只是为了告诉计算机返回布尔值的相反值bool
?
if x == True:
应该写if x:
。
Answers:
not
操作者(逻辑否定)最好的方法可能是使用运算符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
(或那里的其他三个别名之一)。但是由于结果bool
的子类int
可能是意外的,因为它不返回“反布尔”,而是返回“反整数”:
>>> ~True
-2
>>> ~False
-1
这是因为,True
就相当于1
和False
于0
和位反转上的按位表示操作整数 1
和0
。
因此,这些不能用于“否定” a bool
。
如果您要处理包含布尔值的NumPy数组(或子类,例如pandas.Series
或pandas.DataFrame
),则实际上可以使用按位逆运算符(~
)来消除数组中的所有布尔值:
>>> 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])
您不能在NumPy数组上使用not
运算符或operator.not
函数,因为它们要求它们返回一个bool
(而不是布尔数组),但是NumPy还包含一个逻辑非函数,可以在元素上起作用:
>>> 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
值并取反结果来工作。在最简单的情况下,真值将仅调用__bool__
对象。
因此,通过实现__bool__
(或__nonzero__
在Python 2中),您可以自定义true值,从而自定义结果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
语句,以便您可以验证它是否确实调用了该方法:
>>> a = Test(10)
>>> not a
__bool__ called on Test(10)
False
同样,您可以实现应用__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)
再次print
调用以查看它实际上是否被调用:
>>> a = Test(True)
>>> ~a
__invert__ called on Test(True)
False
>>> a = Test(False)
>>> ~a
__invert__ called on Test(False)
True
但是,这样的实现__invert__
可能会造成混淆,因为它的行为不同于“常规” Python行为。如果您这样做的话,请清楚地记录下来,并确保它有一个很好的(和常见的)用例。
您可以只比较布尔数组。例如
X = [True, False, True]
然后
Y = X == False
会给你
Y = [False, True, False]
int
并bool
都内置名(它们所代表的类型),并且不应该被用来作为变量名。