所以我知道python有not运算符,但是not((函数是如何发挥作用的?
从一些简单的测试来看,它似乎具有not(args[](的签名,同时又不像正常函数那样运行。例如:
x = True
not x # -> False
not(x) # -> False
x = False
not x # -> True
not(x) # -> True
not(0) # -> True
not(1) # -> False
not(0, 0, 0) # -> False
not("False") # -> False
function = not # -> Syntax Error
为什么这存在于"不",而不是像"或"这样的东西?有没有办法将 not 函数捕获到变量中/使用 not 作为函数进行其他操作?
这个问题主要是通过尝试在映射调用中找到单个函数来反转列表而引起的,即使它是一个内部函数
没有not
函数。只有运算符not
.添加括号只是在表达式周围添加括号;它不是函数调用(即not(x)
与not x
完全相同(。not(0,0,0)
只是应用于元组(0,0,0)
的not
运算符,它不是"假的",所以结果是假的。
(请注意,这是Python中的情况,其他语言可能not
函数或其他方式来完全表达not
(。
没有not
函数。在这里添加括号是完全多余的,它不是函数调用:
>>> (1) == 1
True
>>> dis.dis('not(1)')
1 0 LOAD_CONST 0 (1)
2 UNARY_NOT
4 RETURN_VALUE
>>> dis.dis('not 1')
1 0 LOAD_CONST 0 (1)
2 UNARY_NOT
4 RETURN_VALUE
当然,你可以构建一个函数def f(x): return not x
但你可能只使用反实函数,即bool()
或operator.truth()
not 是一个关键字而不是一个对象。因此,不能将其设置为变量。
Python 关键字列表 https://www.programiz.com/python-programming/keywo
如前所述,没有像Julia等其他语言那样的否定函数。
这个问题主要是通过尝试在映射调用中找到单个函数来反转列表而引起的,即使它是一个内部函数
如果要使用map
调用否定布尔值列表,只需使用如下lambda
:
>>> mask = [True, False, True]
>>> list(map(lambda b: not b, mask))
[False, True, False]
或者,您可以将 Python 的按位 NOT~
应用于numpy
数组:
>>> import numpy as np
>>> mask = np.array([True, False, True])
>>> ~mask
array([False, True, False], dtype=bool)
请注意,我使用了~
而不是not
。numpy 数组确实不支持逻辑运算符,因此写入not mask
会产生以下错误:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
希望这可以帮助某人!