空列表中“全部”和“任何”结果的原因

时间:2010-07-18 09:59:33

标签: python logic

在Python中,内置函数allany分别返回TrueFalse空迭代。我意识到,如果是相反的方式,仍然可以问这个问题。但我想知道为什么选择了特定的行为。它是任意的,即。它可能就像其他方式一样容易,还是有根本原因?

(我问的原因仅仅是因为我永远不会记得哪个是哪个,如果我知道它背后的理由那么我可能。还有,好奇心。)

10 个答案:

答案 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通常难以理解,所以这里有一些例子,我认为这种行为显然是正确的:

  • 如果所有电影中的对话框都有标题,则电影适合听力障碍。没有对话的电影仍适合听力困难。
  • 所有里面的灯都关闭时,没有窗户的房间很暗。当里面没有灯时,天黑了。
  • 所有液体装在100ml瓶中时,您可以通过机场保安。如果您没有液体,您仍然可以通过保安。
  • 如果所有包中的物品比插槽窄,则可以将软包穿过狭窄的插槽。如果包是空的,它仍然可以穿过插槽。
  • 所有满足其先决条件时,任务就可以开始了。如果任务没有先决条件,则可以开始。

答案 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)

anyall在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的帖子):

  

all(iterable)

     

如果iterable的所有元素都为true(或者iterable为空),则返回True。    等效于:

   def all(iterable):
       for element in iterable:
           if not element:
               return False
      return True
     

any(iterable)

     

如果iterable的任何元素为true,则返回True。如果iterable为空,则返回False。等效于:

   def any(iterable):
       for element in iterable:
           if element:
               return True
       return False

另请参阅CPython-implementation and comments

答案 9 :(得分:0)

  • all([]) == True:零到零-选中
  • any([]) == False:有人吗?没有人-失败