Python all和any函数对空列表的返回值

原创 2014年 10月 23日
标签: PYTHON
本文发布至今已有10年零29天,可能不再适用,请谨慎对待。

先打个广告:欢迎关注我的公众号,参与 文史大挑战 趣味题目。使用方法见 这篇文章

公众号:晚花行乐

正文开始:

Python 有一对内置的函数: all() 和 any(),他们两个都接收可遍历的对象(也就是列表list、元组tuple之类的),all检查所有元素是否全都为真,any检查至少有一个元素为真。本文简单分析它们的用法。

Python 文档中,他们的定义分别是(注意后面的斜体字):

all(iterable)

Return True if all elements of the iterable are true (or if the iterable is empty).

any(iterable)

Return True if any element of the iterable is true. If the iterable is empty, return False.

从定义可以看出,如果把一个空列表传给 any ,会得到 False 的结果,这个容易理解,因为里面没有任何一个元素是真的。但是如果把一个空列表传给 all ,会得到 True,这个似乎不能显而易见。

其实,这个问题可以这么理解:any是或运算,验证至少一个元素为真:

any(a, b, c, ..., z) 
= a + any(b, c, ..., z)
= a + b + any(c, ..., z)
= ...
= a + b + c + ... + z + any([])

为了保证等式成立,必须使any([])为False,否则any的结果永远为 True 对等地,all是与运算,验证全部元素为真:

all(a, b, c, ..., z) 
= a * any(b, c, ..., z)
= a * b * any(c, ..., z)
= ...
= a * b * c * ... * z * all([])

为了保证等式成立,必须使all([])为True,否则all的结果永远为False

这在写递归函数时就很有用,可以参考`Python 用递归生成器计算笛卡尔积

all函数的这种特性产生了一个后果:当检查一个序列都是真值时,必须先检查非空,不然可能会漏过空序列:

if matched and all(matched):
    # do something...

如果您对本文有疑问或者寻求合作,欢迎 联系邮箱邮箱已到剪贴板

标签: PYTHON
给个免费的赞吧~

精彩评论

本站 是个人网站,采用 署名协议 CC-BY-NC 授权。
欢迎转载,请保留原文链接 https://www.lfhacks.com/tech/python-all-any-empty-list/ ,且不得用于商业用途。