前言

在我之前的文章中有any()和all()的对比:any()和all()对比其中介绍了any()函数的基本特性---可迭代对象中有任意一个不为False的时候,返回True,如果可迭代对象为空的话,返回False

由于这个特性,决定了any()可以用在判断语句中与 or 一较高下。那么俩者有区别吗?显然是有的,接下来就让我们详细的对比俩者。

案例

现在有这样的一个场景:某学校要招聘老师,要满足一下任意一个要求:

  1. 有教师资格证
  2. 有教学经验
  3. 是师范专业

现在有一批申请人:

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 的区别

两者的区别总共有俩点:

  1. 语法
  2. 返回值

接下来让我们详细的介绍一下

语法

众所周知 or 是一个逻辑运算符,所以它需要两个参数:

>>> True or False
True

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),让我们看看 orany() 是否这样呢?

ef test_a():
print('A was called')
return True
def test_b():
print('B was called')
return False
print('===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 called
B 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 0
1 >>> None or 0
0

参考

How to Use any() in Python

【Python】any() 或者 or的更多相关文章

  1. Python中的多进程与多线程(一)

    一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...

  2. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  3. Python 小而美的函数

    python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况   any any(iterable) ...

  4. JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议

    软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...

  5. 可爱的豆子——使用Beans思想让Python代码更易维护

    title: 可爱的豆子--使用Beans思想让Python代码更易维护 toc: false comments: true date: 2016-06-19 21:43:33 tags: [Pyth ...

  6. 使用Python保存屏幕截图(不使用PIL)

    起因 在极客学院讲授<使用Python编写远程控制程序>的课程中,涉及到查看被控制电脑屏幕截图的功能. 如果使用PIL,这个需求只需要三行代码: from PIL import Image ...

  7. Python编码记录

    字节流和字符串 当使用Python定义一个字符串时,实际会存储一个字节串: "abc"--[97][98][99] python2.x默认会把所有的字符串当做ASCII码来对待,但 ...

  8. Apache执行Python脚本

    由于经常需要到服务器上执行些命令,有些命令懒得敲,就准备写点脚本直接浏览器调用就好了,比如这样: 因为线上有现成的Apache,就直接放它里面了,当然访问安全要设置,我似乎别的随笔里写了安全问题,这里 ...

  9. python开发编译器

    引言 最近刚刚用python写完了一个解析protobuf文件的简单编译器,深感ply实现词法分析和语法分析的简洁方便.乘着余热未过,头脑清醒,记下一点总结和心得,方便各位pythoner参考使用. ...

  10. 关于解决python线上问题的几种有效技术

    工作后好久没上博客园了,虽然不是很忙,但也没学生时代闲了.今天上博客园,发现好多的文章都是年终总结,想想是不是自己也应该总结下,不过现在还没想好,等想好了再写吧.今天写写自己在工作后用到的技术干货,争 ...

随机推荐

  1. java实现最大镜像子串

    ** 最大镜像子串** [代码填空](满分12分) 串"abcba"以字母"c"为中心左右对称:串"abba" 是另一种模式的左右对称.这两 ...

  2. Linux文件搜索命令find

    命令find可以根据文件的不同属性在指定的范围内搜索文件,例如: 根据文件名进行查找,在目录/etc下搜索文件名为init( -iname 可以实现不区分大小写进行查找)的文件,实现精准查找,只查找文 ...

  3. python3 主机实时监控系统

    主机实时监控系统(可在局域网访问) 一.思路: 前端: 1.管理员登录(编写一个管理员登录界面) 技术:html+css 2.资源数据显示(用于显示主机资源数据情况) 插件:echarts+jquer ...

  4. python3 源码阅读-虚拟机运行原理

    阅读源码版本python 3.8.3 参考书籍<<Python源码剖析>> 参考书籍<<Python学习手册 第4版>> 官网文档目录介绍 Doc目录主 ...

  5. session共享同步redis策略

    关于session共享的文章,网上很多,可是最关键的点我没有看到一篇.也就是session对象到底是怎么同步到redis的. spring-session底层原理到底是怎么样的一个同步更新策略,我没有 ...

  6. 利用struts2进行单个文件,批量文件上传,ajax异步上传以及下载

    利用struts2进行单个文件,批量文件上传,ajax异步上传以及下载 1.页面显示代码 <%@ page language="java" import="java ...

  7. Cron表达式,springboot定时任务

    详细请看这篇博客 参考:https://blog.csdn.net/belonghuang157405/article/details/83410197 Cron表达式是一个字符串,字符串以5或6个空 ...

  8. PHP配合JS导出Excel大量数据

    一般使用PHP导出Excel表格都会用PHPExcel,但是当遇到要导出大量数据时,就会导致超时,内存溢出等问题.因此在项目中放弃使用这种方式,决定采用前段生成Excel的方式来解决问题. 步骤如下: ...

  9. Bash知识点记录

    变量的设置规则   1.  等号两边不能直接接空格符.   2. 右侧的变量内容若有空格符,可使用双引号或单引号将变量内容括起来,其中, 双引号内的特殊字符如 $ 等,可以保有原本的特性.如下所示: ...

  10. 我深爱的Java,对不起,我出轨了!!!呸!渣男!

    我对Java情有独钟 大学三年来,我主学的编程语言一直是Java,为了学好它,我付出了很多心血.现在回想,确实是Java改变了我,造就了我. 因为Java,我自愿在学校组织学弟学妹,给他们讲解Java ...