如果你使用any(lst)你会看到它lst是可迭代的,它是一些项目的列表。如果它包含[0, False, '', 0.0, [], {}, None](都具有布尔值False),那么any(lst)将是False. 如果lst还包含以下任何一项[-1, True, "X", 0.00001](所有这些都评估为True),那么any(lst)将是True.
在您发布的代码中x > 0 for x in lst,这是一种不同类型的可迭代对象,称为生成器表达式。在将生成器表达式添加到 Python 之前,您会创建一个列表推导式,它看起来非常相似,但周围有[]'s: [x > 0 for x in lst]。从lst包含[-1, -2, 10, -4, 20],你会得到这个理解列表:[False, False, True, False, True]。然后,这个内部值将被传递给any函数,该函数将返回True,因为至少存在一个True值。
但是使用生成器表达式,Python 不再需要创建 and 的内部列表True(s),False(s)这些值将在any函数迭代生成器表达式一次生成的值时生成。而且,由于any短路,它会在看到第一个True值时立即停止迭代。lst如果您使用类似的东西创建lst = range(-1,int(1e9))(或者xrange如果您使用的是Python2.x),这将特别方便。尽管这个表达式将生成超过十亿个条目,any但它只需要到达第三个条目1,它的计算结果True是x>0,因此any可以返回True。
如果您创建了一个列表推导,Python 将首先必须在内存中创建十亿个元素的列表,然后将其传递给any. 但是通过使用生成器表达式,您可以让 Python 的内置函数 likeany并all尽早中断,只要看到TrueorFalse值。