为什么Python内置的“all”函数为空迭代返回True?

时间:2012-08-16 01:53:18

标签: python

我知道这有充分的理由,但我想知道是什么原因?

>>> print all([])
True

如果all()旨在检查iterable上的每个项目是否评估为“True”,并且我们知道空列表被评估为False

>>> bool([])
False

为什么all()为空列表返回True?

<编辑>

我已经阅读了文档,我知道了实现

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

但问题是为什么不呢?

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

这有一个逻辑吗?如果你有一个完成任务列表

today_todo_status = [task.status for task in my_todo if task.date == today]
can_i_go_home = all(today_todo_status)

好的,在上面的假设的示例中,如果我没有任务,那么它真的很有意义,所以我可以回家。

但还有其他情况,我不认为所有()都是为todo列表制作的.LOL

< / edit>

7 个答案:

答案 0 :(得分:30)

这表示为“对于S中的所有X,X为真”。如果S为空,则没有X.但是,真实陈述仍然是真的,因为对于所有X,X都是真的......那里没有任何X!

以下是using logic的解释。

  

考虑两组A和B,其中A + B是两组的并集。

     

如果有(A + B)=真 - >任何(A)或任何(B)=真,但我们不能断言   任何(A)=真或任何(B)=真。

     

如果有(A + B)=假 - >任何(A)=假,任何(B)=假。

     

如果所有(A + B)=真 - > all(A)= True,all(B)= True

     

如果所有(A + B)=假 - > all(A)= False或all(B)= False但我们不能断言all(A)= False或all(B)= False。

     

现在代替B,让我们将空集0添加到A.我们想要出现   逻辑使得添加空集不会改变值   all()或any(),因为A + 0 = A。

     

任何(A + 0)=任何(A)或任何(0)

     

any(0)必须为False,因此如果任何(A)为True,则任何(A + 0)为True,并且   如果任何(A)为假,则任何(A + 0)为假。

     

全部(A + 0)=全部(A)和全部(0)

     

如果所有(A)都为真,则所有(A + 0)为真。因此,all(0)为True。

答案 1 :(得分:9)

all()(如果迭代的所有元素都为真(或者如果可迭代为空),则记录到" 返回True。&# 34;)相当于以下内容:

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

由于没有元素,它将跳过循环并返回True

答案 2 :(得分:1)

因为所有元素都是True。如果没有元素,您可以说“所有元素都是......任何东西'

答案 3 :(得分:1)

这来自数学逻辑。

“空集的元素一切都是真的”(http://en.wikipedia.org/wiki/Empty_set

另见http://en.wikipedia.org/wiki/Vacuous_truth

答案 4 :(得分:0)

ELI5版本。

获取数字列表

L = [1,2,3,4,6]

all([isintance(l, int) for l in L])

all的定义方式是,使其成为False的唯一方法是提供at least一个非整数。

类似地定义any的方式是,使它Trueat-least一个正整数。

由于all()any()的补码,一个必须为True,而另一个必须为False

答案 5 :(得分:0)

在测试条件时,我们希望始终将第一个元素添加到列表中。例如,如果我们只想将小于或小于最小的数字添加到列表中,则可以这样做:

def addToList(less,num):
    if less:
        if any( num >= savedNum for savedNum in numbers):
            print('{} is not less'.format(num))
            return
    elif any( num <= savedNum for savedNum in numbers):
        print('{} is not greater'.format(num))
        return

    numbers.append(num)


numbers = []
doLess = True
doMore = False
addToList(doLess,5) #numbers is empty, but will be added
addToList(doLess,2)
addToList(doLess,7)
addToList(doMore,15)
addToList(doMore,9)
print(numbers)

输出:

7 is not less [5, 2]
9 is not greater [5, 2, 15]
[5, 2, 15]

答案 6 :(得分:0)

假设all([])False

然后,对于所有非空列表Aall(A + [])也应为False

all(A + []) = all(A) and all([])
            = all(A) and False
            = False

A + [] = A起,我们知道

all(A + []) = all(A) for any non empty list A

但是,all(A)可能是True(例如A = [True]

因此

对于所有非空列表Aall(A + [])也应为False

这是矛盾的。结果,第一个假设是错误的,并且

all([])True