当前位置: 首页 > 面试题库 >

为什么内置于“ all”函数中的Python对于空的可迭代对象返回True?

宗政才俊
2023-03-14
问题内容

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

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

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

但是还有其他情况,我不认为all()是为待办事项清单制作的。


问题答案:

这表示为“对于S中的所有X,X为真”。如果S为空,则没有X。但是,真值声明仍然为True,因为对于所有X来说,X都是真实的……根本就没有X!

这是使用逻辑的解释。

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

如果any(A + B)= True-> any(A)或any(B)= True,但是我们不能断言any(A)= True或any(B)= True。

如果any(A + B)= False-> any(A)= False和any(B)= False。

如果all(A + B)= True-> all(A)= True和all(B)= True

如果all(A + B)= False-> 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,因此,如果any(A)为True,则any(A + 0)为True,如果any(A)为False,则any(A +
0)为False。

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

如果all(A)为True,则all(A + 0)为True。因此,all(0)为True。



 类似资料:
  • 本文向大家介绍详解Python中的内建函数,可迭代对象,迭代器,包括了详解Python中的内建函数,可迭代对象,迭代器的使用技巧和注意事项,需要的朋友参考一下 Python中的内建函数和可迭代对象,迭代器 求值标识 id() #标识id 返回对象的唯一标识,CPython返回内存地址 hash() #哈希, 返回对象的哈希值 len(s) -->返回一个集合类型的元素个数 range(start,

  • 问题内容: 我和我的同事有一个错误,这是由于我们假设会返回空流调用而导致的。 当然,假定和不阅读文档是我们的错。但是我不明白的是为什么空流的默认行为会返回。这是什么原因呢?像(相反地返回false)一样,此操作以命令式方式使用,它离开了monad,并且可能在语句中使用了。考虑到这些事实,是否有任何理由使大多数用途都需要默认为空流? 问题答案: 这就是所谓的虚无事实。空集合的所有成员都满足您的条件;

  • 将这些视为对象: 查看java文档,对于LinkedList类,LinkedList类中没有迭代器方法的实现,但是,实现是在AbstractSequentialList类中。 listIterator()方法在AbstractList类中实现,AbstractSequentialList的父类,总结一下,如果我没弄错的话,它返回一个不使用节点概念的迭代器对象。 但是方法是在LinkedList类中

  • 问题内容: 在浏览一些旧代码时,我遇到了这个宝石: 第二行在Eclipse中被标记为无效代码,我知道为什么。似乎没有明确抛出任何异常,并且构造函数不可能抛出任何类型的异常(例如)。 我的问题是 为什么 要进行空检查?以前在Java的旧版本中,构造函数是否可以返回null?还是这仅仅是毫无用处的代码? 问题答案: 该代码在任何Java版本中均无效。构造函数不可能返回,即使构造函数会抛出异常,也不会调

  • 我可以使用Java streams/lambda表达式来执行这个迭代,而不是使用while循环来填充列表吗?

  • 目标是修改对象中的元素,因此我的思维过程是首先获得对象的索引,然后使用所述索引将我指向要修改的正确对象 我正在使用对象中的name元素搜索对象,但每当我打印索引以确保它收集到正确的索引时,对于尝试的所有名称,我总是得到-1,即使对象存在与我搜索的名称相同的名称。 项目类 项目类别