函数any()在Python 2.5中引入,用于便捷地检查可迭代对象(例如,列表、元组、生成器)中是否至少有一个真实元素。它在需要检查多个条件中至少满足一个时非常有用。
历史上没有这个函数时,人们需要编写循环,当找到元素时中断,或者组合使用map和reduce,这很繁琐且缓慢。any()解决的主要问题是这种检查的简洁性和可读性。
解决方案是any()和all()都使用懒惰求值(只要找到False或True即停止)。重要的是要理解它们之间的区别:any()在找到第一个真实元素时返回True,而all()只有在所有元素都为真时才返回True。
代码示例:
nums = [0, 0, 3, 0] if any(nums): print('列表中有非零元素')
关键特点:
如果将空列表作为参数传递给any()会发生什么?
any()将返回False。这很合逻辑:在空序列中没有任何真实元素。
any()与all()在原则上有什么不同?
any()检查是否存在至少一个真实值。all()检查所有值的真实性。它们的结果只是对严格空集合互为相反。
可以将any()与可能为无限的生成器一起使用吗?
可以,正是因为懒惰求值,当遇到True时any将停止。如果生成器永远不返回True,则函数本身不会结束。
def infinite_gen(): while True: yield 0 # any(infinite_gen()) — 如果没有退出条件将无限运行
希望检查至少一个值不为None:
values = [None, None, None] if any(values): do_something() # 如果只是忘记了None == False,将永远不会执行
优点:
缺点:
正确的做法是寻找至少一个年龄超过30岁的人:
users = [{'age': 25}, {'age': 35}] if any(u['age'] > 30 for u in users): print('有年龄超过30的用户')
优点:
缺点: