任何人都可以解释为什么在这种情况下在 python 内置 buinction中all
返回?True
all([])
In [33]: all([])
Out[33]: True
In [34]: all([0])
Out[34]: False
In [35]: __builtins__.all([])
Out[35]: True
任何人都可以解释为什么在这种情况下在 python 内置 buinction中all
返回?True
all([])
In [33]: all([])
Out[33]: True
In [34]: all([0])
Out[34]: False
In [35]: __builtins__.all([])
Out[35]: True
我不相信任何其他答案都真正解决了为什么会这样的问题。
Python 的定义all()
来自布尔逻辑。例如,如果我们说“所有天鹅都是白色的”,那么一只黑天鹅就反驳了这个说法。然而,如果我们说“所有的独角兽都是粉红色的”,逻辑学家会认为这是一个正确的陈述,因为没有非粉红色的独角兽。或者换句话说,“所有”都是空洞的。
实际上,它给了我们一个有用的不变量。如果all(A)
和all(B)
都为真,那么 的组合all(A + B)
也为真。如果all({})
是假的,我们应该有一个不太有用的情况,因为组合两个表达式,其中一个是假的突然会给出一个意想不到的真结果。
因此 Pythonall([]) == True
取自布尔逻辑,并与其他具有类似结构的语言保持一致。
回到 Python 中,在许多情况下,空洞的事实使算法变得更简单。例如,如果我们有一棵树并且想要验证所有节点,我们可能会说一个节点是有效的,如果它满足某些条件并且它的所有子节点都是有效的。有了另一种定义,all()
它变得更加复杂,因为我们不得不说它是有效的,如果它满足条件并且没有孩子或者它的所有孩子都是有效的。
class Node:
def isValid(self):
return some_condition(self) and all(child.isValid for child in self.children)
从文档:
如果可迭代对象的所有元素都为真(或可迭代对象为空),则返回 True。
所以,粗略地说,它只是这样定义的。
你可以通过使用来解决这个问题
list = []
if list and all(list):
pass
正如文档所说,all
相当于:
def all(iterable):
for element in iterable:
if not element:
return False
return True
对于空iterable
的循环体永远不会执行,所以True
会立即返回。
任何表达式all
都可以重写,any
反之亦然:
not all(iterable)
# is the same as:
any(not x for x in iterable)
并且对称
not any(iterable)
# is the same as:
all(not x for x in iterable)
这些规则要求all([]) == True
.
该函数all
对于可读的断言非常有用:
assert all(required_condition(x) for x in some_results_being_verified)
(如果一个任务没有结果,那还不错,但是如果任何结果不正确,那么事情就会很糟糕。)
对此的另一种解释是all
和是二元运算符和任意长参数any
的泛化。因此,和可以定义为:and
or
all
any
def all(xs):
return reduce(lambda x,y: x and y, xs, True)
def any(xs):
return reduce(lambda x,y: x or y, xs, False)
和参数表明True
和。False
all([]) == True
any([]) == False