对于以下示例:
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)
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)
如果要使用需要谓词函数或回调的函数,这些函数非常有用.
>>> 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个别名之一).但因为它bool
是int
结果的子类可能是意外的,因为它不返回"反向布尔",它返回"反向整数":
>>> ~True
-2
>>> ~False
-1
Run Code Online (Sandbox Code Playgroud)
这是因为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])
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行为不同.如果您这样做,请清楚地记录它并确保它具有非常好(和常见)的用例.
小智 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
也是反转布尔值的更快方法。
归档时间: |
|
查看次数: |
118405 次 |
最近记录: |