一般来说:
all和any是接受某些iterable并返回True的函数,如果在all()的情况下,iterable中没有任何值是错误的
在any()的情况下,至少有一个值是真的。
值x是falsy iff bool(x) == False。
值x是真实的iff bool(x) == True。
iterable中的任何非boolean都将很好-bool(x)将根据以下规则强制任何x:0,0.0,None,[],(),[],set(),其他空集合将产生False,任何其他True。bool的docstring使用术语'true'/'false'表示'truthy'/'falsy',使用术语True/False表示具体的布尔值。
在您的特定代码示例中:
你有点误解了这些功能是如何工作的。因此,以下所做的事情完全不是您所想的:if any(foobars) == big_foobar:
…因为any(foobars)首先被求值为True或False,然后将该布尔值与big_foobar进行比较,后者通常总是给您False(除非big_foobar碰巧是相同的布尔值)。
注意:iterable可以是一个列表,但也可以是一个生成器/生成器表达式(≈惰性求值/生成的列表)或任何其他迭代器。
你想要的是:if any(x == big_foobar for x in foobars):
它首先构造一个iterable,为foobars中的每个项生成一个布尔序列,然后将该项与big_foobar进行比较,并将得到的布尔值发送到结果序列中:tmp = (x == big_foobar for x in foobars)
然后any遍历tmp中的所有项,并在找到第一个truthy元素时返回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