一般来说:
all
and any
是接受一些可迭代并返回的函数True
, if
- 如果是
all
,迭代中没有值是假的;
- 如果是
any
,至少有一个值是真实的。
A value x
是假的当且仅当bool(x) == False
。
一个值x
是真实的当且仅当bool(x) == True
.
可迭代中的任何非布尔元素都是完全可以接受的 -bool(x)
地图,或强制,任何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
碰巧是相同的布尔值)。
Note:可迭代可以是一个列表,但它也可以是一个生成器或生成器表达式(≈延迟计算/生成的列表),或任何其他迭代器。
你想要的是:
if any(x == big_foobar for x in foobars):
它基本上首先构造一个迭代器,该迭代器为中的每个项目生成一系列布尔值foobars
,它将该项目与所持有的值进行比较big_foobar
,并且(惰性地)将生成的布尔值发送到生成的布尔值序列中:
tmp = (x == big_foobar for x in foobars)
then 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
Note:正如帝斯曼指出的,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