在Python中,内置函数all
和any
分别返回True
和False
空迭代。我意识到,如果是相反的方式,仍然可以问这个问题。但我想知道为什么选择了特定的行为。它是任意的,即。它可能就像其他方式一样容易,还是有根本原因?
(我问的原因仅仅是因为我永远不会记得哪个是哪个,如果我知道它背后的理由那么我可能。还有,好奇心。)
答案 0 :(得分:36)
一些比喻怎么样......
你有一个袜子抽屉,但它目前是空的。它是否包含任何黑色袜子?不 - 你根本没有任何袜子,所以你当然没有黑色袜子。显然any([])
必须返回false - 如果返回true,这将是违反直觉的。
all([])
的情况稍微困难一些。请参阅vacuous truth上的维基百科文章。另一个类比:如果一个房间里没有人,那个房间里的每个人都会说法语。
可以写出数学all([])
:
,其中集合A为空。
关于空洞陈述是否应该被认为是真实的,存在相当大的争议,但从逻辑的角度来看它是最有意义的:
所有真实真实陈述都是真实的主要论点如下:正如logical conditionals文章中所解释的那样,命题逻辑的公理要求如果P为假,那么P =>问:是的。也就是说,如果我们接受这些公理,我们必须接受真实的陈述确实是真的。
同样来自文章:
似乎没有直接理由选择真实;如果我们不这样做,那就是我们脸上的事情会爆炸。
定义一个“真实的”语句以在Python中返回false会违反principle of least astonishment。
答案 1 :(得分:20)
any
的一个属性是其递归定义
any([x,y,z,...]) == (x or any([y,z,...]))
这意味着
x == any([x]) == (x or any([]))
当且仅当x
被定义为False时,任何any([])
的相等性都是正确的。类似于all
。
答案 2 :(得分:7)
我相信all([])==True
通常难以理解,所以这里有一些例子,我认为这种行为显然是正确的:
答案 3 :(得分:4)
我认为它们是以这种方式实施的
def all(seq):
for item in seq:
if not item:
return False
return True
def any(seq):
for item in seq:
if item:
return True
return False
不确定 是通过
实现的答案 4 :(得分:4)
Perl 6还采用空列表上的all()
和any()
作为各自缩减运算符的理智基础的位置,因此all()
为真且{{1是假的。
也就是说,any()
相当于all(a, b, c)
,相当于[&] a, b, c
(减少“junctive和”运算符,但你可以忽略结点并认为它是逻辑和这篇文章),a & b & c
相当于any(a, b, c)
,相当于[|] a, b, c
(减少“junctive”或“运算符” - 再次,你可以假装它是相同的合乎逻辑或没有遗漏任何东西)。
任何可以对其应用缩减的运算符在减少0项时都需要具有已定义的行为,并且通常通过使用自然标识元素来完成 - 例如a | b | c
(减少零加法) term)是0,因为0是加性身份;向任何表达式添加零会使其保持不变。 [+]()
同样是1,因为1是乘法同一性。我们已经说[*]()
相当于all
而[&]
相当于any
- 嗯,真相是和 - 身份,虚假是或 - 身份 - x和True 是x, x或False 是x。这使[|]
不可避免地成为真,all()
应该是假的。
为了将它置于一个完全不同(但实际)的视角,any()
是一个开始于假的锁存器,只要它看到真实的东西就会变为真; any
是一个开始时为true的锁存器,只要它看到错误就会变为false。给他们没有参数意味着他们没有机会改变状态,所以你只是问他们他们的“默认”状态是什么。 :)
答案 5 :(得分:2)
为了一般兴趣,这里是blog post,其中GvR提出任何/所有的示例实现,如gnibbler和ABC中的引用量化器。
答案 6 :(得分:2)
any
和all
在python中具有与其他地方相同的含义:
any
为真all
不是真的答案 7 :(得分:1)
这实际上更像是评论,但评论中的代码效果不佳。
除了any()
和all()
为什么工作的其他逻辑基础之外,他们必须有相反的“基础”案例,以便这种关系成立:
all(x for x in iterable) == not any(not x for x in iterable)
如果iterable
为零长度,则上述情况仍然应该成立。因此
all(x for x in []) == not any(not x for x in [])
相当于
all([]) == not any([])
如果any([])
是真实的话,那将是非常令人惊讶的。
答案 8 :(得分:1)
目前尚不清楚官方原因,但来自文档(确认@John La Rooy的帖子):
如果iterable的所有元素都为true(或者iterable为空),则返回
True
。 等效于:def all(iterable): for element in iterable: if not element: return False return True
如果iterable的任何元素为true,则返回
True
。如果iterable为空,则返回False
。等效于:def any(iterable): for element in iterable: if element: return True return False
答案 9 :(得分:0)
all([]) == True
:零到零-选中any([]) == False
:有人吗?没有人-失败