代码之家  ›  专栏  ›  技术社区  ›  detly FBruynbroeck

空列表中“所有”和“任何”结果的原因

  •  23
  • detly FBruynbroeck  · 技术社区  · 14 年前

    在Python中,内置函数 all any 返回 True False 分别用于空iterables。我意识到,如果是相反的方式,这个问题仍然可以问。但我想知道为什么 选择了行为。这是武断的吗?也可能是另一种方式,还是有潜在的原因?

    )我问这个问题的原因很简单,因为我从来都不记得哪个是哪个,如果我知道背后的道理,那么我可能会。还有好奇心。)

    10 回复  |  直到 14 年前
        1
  •  45
  •   Community THelper    7 年前

    来点类比吧。。。

    你有一个袜子抽屉,但它现在是空的。里面有黑袜子吗?没有-你根本没有袜子,所以你肯定没有黑色的。很明显 any([]) 必须返回false-如果返回true,这将违反直觉。

    关于 all([]) vacuous truth . 另一个比喻是:如果一个房间里没有人,那么这个房间里的每个人都会说法语。

    数学上 可写为:

    其中集合A为空。

    logical conditionals 命题逻辑的公理是:如果P为假,则P=>Q是真的。也就是说,如果我们接受这些公理,我们就必须接受空洞真实的陈述确实是真实的。

    同样来自文章:

    在Python中定义一个“vacuously true”语句返回false将违反 principle of least astonishment

        2
  •  21
  •   kennytm    14 年前

    财产 any 是它的递归定义

    any([x,y,z,...]) == (x or any([y,z,...]))
    

    x == any([x]) == (x or any([]))
    

    x any([]) 定义为False。类似于 all

        3
  •  12
  •   Weeble    12 年前

    我相信 all([])==True 通常更难理解,因此下面是一些我认为行为明显正确的例子:

    • 全部的 影片中的对白有字幕。没有对白的电影仍然适合重听者。
    • 没有窗户的房间在下雨时是黑暗的 里面的灯都关了。当里面没有灯的时候,天就黑了。
    • 你可以在什么时候通过机场安检 全部的 你的液体装在100毫升的瓶子里。如果你没有液体,你仍然可以通过安全检查。
    • 你可以通过一个狭窄的槽装一个软袋,如果 包里的东西比槽窄。如果袋子是空的,它仍然可以穿过插槽。
    • 任务准备开始时 它的先决条件已经满足。如果任务没有先决条件,它就可以开始了。
        4
  •  5
  •   John La Rooy    14 年前

    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
    

    不确定他们 尽管如此

        5
  •  4
  •   hobbs    14 年前

    all() any() 在空列表上,应该作为它们各自的归约运算符的合理基本情况,因此 全部() 任何()

    all(a, b, c) 相当于 [&] a, b, c a & b & c (减少了“junctive and”操作符,但您可以忽略junctions,并将其视为本文的逻辑and),以及 any(a, b, c) 相当于 [|] a, b, c a | b | c

    任何可以应用归约的运算符在归约0项时都需要有一个已定义的行为,这通常是通过使用一个自然的标识元素来实现的--例如, [+]() [*]() 同样是1,因为1是乘法恒等式。我们已经说过了 all 相当于 [&] any 相当于 [|] x和True 是x,和 x或False 全部() 任何()

    从一个完全不同的(但实际的)角度来看, 任何 全部的

        6
  •  3
  •   zvone    14 年前

    any all 在python中的含义与其他地方相同:

    • 如果至少有一个是不正确的,则为不正确
        7
  •  2
  •   ars    14 年前

    blog post 其中GvR提出了any/all和gnibbler的示例实现,并引用了ABC中的quanifiers。

        8
  •  2
  •   steveha    10 年前

    这实际上更像是一个注释,但是注释中的代码工作得不太好。

    除了其他的逻辑基础为什么 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([]) 是真的。

        9
  •  1
  •   pylang    6 年前

    官方原因尚不清楚,但从文件来看(证实@John La Rooy的帖子):

    all(iterable)

    返回 True 如果iterable的所有元素都为true(或者iterable为空)。

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

    any(iterable)

    返回 是的 如果iterable的任何元素为true。如果iterable为空,则返回 False . 相当于:

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

    另请参见 CPython-implementation and comments .

        10
  •  0
  •   simno    5 年前
    • all([]) == True :零中零-检查
    • any([]) == False