一般来说:
all并且
any是需要一些迭代并返回的函数
True,如果
- 在的情况下
all()
,迭代器中的任何值都不是虚假的; - 在的情况下
any()
,至少一个值是真实的。
值
x是假iff
bool(x) == False。值
x是正确的iff
bool(x) == True。
在迭代将被罚款的任何非布尔值-
bool(x)将迫使任何
x根据这些规则:
0,
0.0,
None,
[],
(),
[],
set(),等空的集合将产生
False,其他任何东西
True。该docstring
bool使用术语’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):
它基本上首先构造一个可迭代的对象,该对象产生一个布尔序列-
对于中的每个项目
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 inxs但后者更具可读性,编写速度更快,运行速度更快。
一些例子:
In [1]: any(x > 5 for x in range(4))Out[1]: FalseIn [2]: all(isinstance(x, int) for x in range(10))Out[2]: TrueIn [3]: any(x == 'Erik' for x in ['Erik', 'John', 'Jane', 'Jim'])Out[3]: TrueIn [4]: all([True, True, True, False, True])Out[4]: False
另请参阅:http :
//docs.python.org/2/library/functions.html#all
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)