通常来说,一般来说:
all
并且any
是需要一些可迭代和返回的函数True
,如果
- 在 的情况下
all()
,iterable 中没有任何值是虚假的;
- 在 的情况下
any()
,至少有一个值为真。
一个值x
是假的 iff bool(x) == False
。一个值x
是真实的 iff bool(x) == True
。
可迭代对象中的任何非布尔值都可以——将根据以下规则bool(x)
映射(或强制,如果您愿意)任何对象: , , , , , ,和其他空集合映射到, 其他任何对象到. 文档字符串使用术语 'true'/'false' 表示“truthy”/“falsy”,使用/表示具体的布尔值。x
0
0.0
None
[]
()
[]
set()
False
True
bool
True
False
在您的特定代码示例中:
您误解了这些功能的工作原理。因此,以下内容完全不是您想的那样:
if any(foobars) == big_foobar:
...因为any(foobars)
将首先评估为True
or False
,然后将该布尔值与 进行比较big_foobar
,这通常总是给你False
(除非big_foobar
碰巧碰巧是相同的布尔值)。
注意: iterable 可以是一个列表,但它也可以是一个生成器/生成器表达式(≈ 懒惰评估/生成的列表)或任何其他迭代器。
你想要的是:
if any(x == big_foobar for x in foobars):
它基本上首先构造一个产生一系列布尔值的迭代——对于 中的每个项目foobars
,它将项目与该项目进行比较并将big_foobar
结果布尔值发送到结果序列中:
tmp = (x == big_foobar for x in foobars)
然后any
遍历所有项目并在找到第一个真实元素后立即tmp
返回。True
就好像您执行了以下操作:
In [1]: foobars = ['big', 'small', 'medium', 'nice', 'ugly']
In [2]: big_foobar = 'big'
In [3]: any(['big' == big_foobar, 'small' == big_foobar, 'medium' == big_foobar, 'nice' == big_foobar, 'ugly' == big_foobar])
Out[3]: True
注意:正如 DSM 所指出的,any(x == y for x in xs)
等同于y in xs
但后者更具可读性,编写速度更快,运行速度更快。
一些例子:
In [1]: any(x > 5 for x in range(4))
Out[1]: False
In [2]: all(isinstance(x, int) for x in range(10))
Out[2]: True
In [3]: any(x == 'Erik' for x in ['Erik', 'John', 'Jane', 'Jim'])
Out[3]: True
In [4]: all([True, True, True, False, True])
Out[4]: False
另见:http ://docs.python.org/2/library/functions.html#all