【Python】any() 或者 or,,前言在我之前的文章中
【Python】any() 或者 or,,前言在我之前的文章中
前言
在我之前的文章中有any()和all()的对比:any()和all()对比其中介绍了any()函数的基本特性---可迭代对象中有任意一个不为False的时候,返回True,如果可迭代对象为空的话,返回False
由于这个特性,决定了any()可以用在判断语句中与 or 一较高下。那么俩者有区别吗?显然是有的,接下来就让我们详细的对比俩者。
案例
现在有这样的一个场景:某学校要招聘老师,要满足一下任意一个要求:
有教师资格证有教学经验是师范专业现在有一批申请人:
applicants = [ { "name":"张三", "has_degree": False, "has_experience":True, "is_professional": False }, { "name":"李四", "has_degree": True, "has_experience":False, "is_professional": False }, { "name":"王二", "has_degree": False, "has_experience":False, "is_professional": False }]
如何从这样的数据判断申请人是否符合条件呢?
or
for applicant in applicants: if applicant.get("has_degree") or applicant.get("has_experience") or applicant.get("is_speical"): print(f‘{applicant["name"]} 符合条件!‘)
输出结果:
张三 符合条件!李四 符合条件!
any
如果使用 any() 就需要参数是可迭代的(iterable),也就意味着我们需要将参数转化为list、tupple等。
for applicant in applicants: if any(applicant.get("has_degree"),applicant.get("has_experience"), applicant.get("is_speical")): print(f‘{applicant["name"]} 符合条件!‘)
显然最终输出结果是一样的。
到这里,是不是觉得 any() 像升级版的 or ? 那究竟是不是这样子呢?别着急忘下看。
or 和 any 的区别
两者的区别总共有俩点:
语法返回值接下来让我们详细的介绍一下
语法
众所周知 or 是一个逻辑运算符,所以它需要两个参数:
>>> True or FalseTrue
而 any() 是一个函数,只需要一个可迭代的参数:
>>>any([True,False])True
这就意味着,如果对于一个可迭代的参数使用any()会显得更简单一旦,如果使用or,则需要我们去遍历了:
>>> import functools>>> functools.reduce(lambda x, y: x or y, (True, False, False))True
除了这个区别,俩者还有一个更重要的区别,正常情况下当众多条件下出现一个True的时候,我们希望对余下的条件不做任何判断直接返回 True(这种被称作 短路求值short-circuit evaluation 或者 延迟计算lazy evaluation),让我们看看 or 和 any() 是否这样呢?
ef test_a(): print(‘A was called‘) return Truedef test_b(): print(‘B was called‘) return Falseprint(‘===call_or===‘)a_or_b = test_a() or test_b()print(‘===call_any===‘)a_any_b = any([test_a(),test_b()])
运行一下看一下输出结果:
===call_or===A was called===call_any===A was calledB was called
从结果不难发现,or 是按照预期返回的,而any()则不是。那么有没有办法让Python调用函数的时候也遵循 延迟计算(lazy evaluation)呢?方法是有的---通过map()构造一个生成器或者使用生成器表达式:
a_any_iterable_b = any((test() for test in [test_a,test_b]))
上面的例子就是使用生成器表达式(generator expression),当其中一个条件返回为True,则any()就会直接返回True,而不会继续校验余下的条件。
返回值
any()和or俩者的返回值也大不相同。any()在任何清理下都会返回一个布尔值(True、False):
>>> any((1, 0))True
or则不是这样,它会发现它找到的第一个布尔值为True的元素,即bool(value)为True,返回value,否则返回最后一个元素:
>>> 1 or 01>>> None or 00
参考
How to Use any() in Python
【Python】any() 或者 or
相关内容
- Python学习-列表的使用与编辑,, 1 list =
- python 格式化输出,,# 格式化输出:fo
- python 习题,,题目:有四个数字:1
- Python学习1-起点,,准备开始学习Pyth
- python3 f-string格式化字符串的高级用法,,从Python 3.
- python中的dumps和loads区别,,一.概念理解json
- python函数 之 提升Python效率之使用循环机制代替递归函
- CentOS7 安装 Python3.8后 pip 安装报错,,[root@loca
- Python:sklearn中StandardScaler和scale的区别,,StandardSc
- python实现的最低松弛度优先(LLF)算法,, 1 #!/use
评论关闭