如果您使用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 之前,您将创建一个 列表理解,它看起来非常相似,但周围有 [] 的:[x > 0 for x in lst]。从包含[-1, -2, 10, -4, 20] 的lst 中,您会得到这个综合列表:[False, False, True, False, True]。然后这个内部值将被传递给any 函数,该函数将返回True,因为至少有一个True 值。
但是使用 生成器表达式,Python 不再需要创建 True(s) 和 False(s) 的内部列表,这些值将在 any 函数迭代生成的值时生成一次由生成器表达式。 而且,由于any 短路,它会在看到第一个True 值时立即停止迭代。如果您使用类似lst = range(-1,int(1e9))(或xrange,如果您使用Python2.x)创建lst,这将特别方便。即使这个表达式将生成超过十亿个条目,any 只需要到达1 时的第三个条目,它会将True 计算为x>0,因此any 可以返回@ 987654354@。
如果您创建了一个列表推导式,Python 必须首先在内存中创建十亿个元素的列表,然后将其传递给any。但是通过使用生成器表达式,您可以让 Python 的内置函数(如 any 和 all)在看到 True 或 False 值时尽早爆发。