Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python “原因”;“全部”;及;任何;空列表上的结果_Python_Logic - Fatal编程技术网

Python “原因”;“全部”;及;任何;空列表上的结果

Python “原因”;“全部”;及;任何;空列表上的结果,python,logic,Python,Logic,在Python中,内置函数和分别返回空iterable的True和False。我意识到,如果是另一种情况,这个问题仍然可以提出。但我想知道为什么会选择这种特定的行为。这是武断的吗,也就是说,可能是另一种方式,还是有潜在的原因 (我问这个问题的原因很简单,因为我从来都不记得哪个是哪个,如果我知道它背后的原理,那么我可能会问。还有好奇心。)一些类比怎么样 您有一个袜子抽屉,但它当前是空的。里面有黑色的袜子吗?没有-你根本没有袜子,所以你肯定没有黑色的。显然any([])必须返回false-如果返回t

在Python中,内置函数和分别返回空iterable的
True
False
。我意识到,如果是另一种情况,这个问题仍然可以提出。但我想知道为什么会选择这种特定的行为。这是武断的吗,也就是说,可能是另一种方式,还是有潜在的原因


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

一些类比怎么样

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

all([])
的情况稍微困难一些。请参阅维基百科上的文章。另一个类比:如果房间里没有人,那么房间里的每个人都会说法语

从数学上讲,
所有([])
都可以写入:

其中集合A为空

关于空洞的陈述是否应该被视为真实存在着相当多的争论,但从逻辑的角度来看,这是最有意义的:

所有虚真陈述都为真的主要论点如下:如上一篇文章中所解释的,命题逻辑的公理意味着,如果p为假,那么p=>Q为真。也就是说,如果我们接受这些公理,我们必须接受真空真实的陈述确实是真实的

文章还指出:

似乎没有直接的理由去选择真实;如果我们不这样做,事情就会在我们面前爆发


在Python中定义一个“vacuously true”语句以返回false将违反规则。

any的一个属性是它的递归定义

any([x,y,z,...]) == (x or any([y,z,...]))
这意味着

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

当且仅当
any([])
定义为False时,该等式对于任何
x
都是正确的。类似于
所有的

我认为它们是以这种方式实现的

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

虽然不确定它们是以这种方式实现的,但出于普遍的兴趣,这里是GvR提出的任何/所有示例实现,如gnibbler和ABC中的引用量化器

Perl 6还认为空列表上的
all()
any()
应该作为它们各自的归约运算符的合理基本情况,因此
all()
为true而
any()
为false

< > >代码> >所有(A,B,C)相当于<代码> [a,b,c< /代码>,相当于<代码> a & b& c < /> >(对“连接”和“运算符”的约简,但可以忽略连接,并认为它是逻辑的,对于该帖),任何(a,b,c)< /代码>相当于<代码> [a,b,c< /代码>,这相当于
a | b | c
(减少“连接或”运算符——同样,您可以假装它与逻辑相同或没有遗漏任何内容)

任何可以应用归约的运算符在归约0项时都需要有一个已定义的行为,这通常是通过具有一个自然标识元素来实现的——例如,
[+]()
(零项加法归约)是0,因为0是加法标识;将零添加到任何表达式都会使其保持不变
[*]()
同样是1,因为1是乘法标识。我们已经说过,
所有的
都等同于
[&]
任何的
都等同于
[|]
——好吧,真理是和身份,虚假是或身份——x和真是x,x或假是x。这使得
all()
必然为真,而
any()
必然为假


从一个完全不同的(但实际的)角度来看,
any
是一个闩锁,它从false开始,在看到true时变为true
all
是一个锁存器,它从true开始,在看到错误时变为false。不给他们争论意味着不给他们改变状态的机会,所以你只是问他们“默认”状态是什么

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

  • 如果至少有一个为真,则任何
    均为真
  • 如果至少有一个不正确,
    all
    不正确
我认为
all([])==True
通常更难理解,因此下面是一组我认为行为显然是正确的示例:

  • 如果电影中的所有对话都有字幕,那么电影适合重听人观看。没有对白的电影仍然适合重听者
  • 当室内所有的灯都熄灭时,没有窗户的房间是黑暗的。当里面没有灯光时,它是黑暗的
  • 当你所有的液体都装在100毫升的瓶子里时,你可以通过机场安检。如果你没有液体,你仍然可以通过安全检查
  • 如果袋子中的所有物品都比插槽窄,则可以通过窄插槽装入软袋。如果袋子是空的,它仍然可以穿过插槽
  • 当任务的所有先决条件都满足时,任务就可以开始了。如果任务没有先决条件,则可以开始

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

      除了说明为什么
      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([])
      

      如果
      任何([])
      都是真实的,那将是非常令人惊讶的。

      官方原因尚不清楚,但从文件(证实@John La Rooy的帖子): def all(iterable): for element in iterable: if not element: return False return True
   def any(iterable):
       for element in iterable:
           if element:
               return True
       return False