【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 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),让我们看看 or 和 any() 是否这样呢?
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
参考
【Python】any() 或者 or的更多相关文章
- Python中的多进程与多线程(一)
一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- Python 小而美的函数
python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况 any any(iterable) ...
- JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议
软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...
- 可爱的豆子——使用Beans思想让Python代码更易维护
title: 可爱的豆子--使用Beans思想让Python代码更易维护 toc: false comments: true date: 2016-06-19 21:43:33 tags: [Pyth ...
- 使用Python保存屏幕截图(不使用PIL)
起因 在极客学院讲授<使用Python编写远程控制程序>的课程中,涉及到查看被控制电脑屏幕截图的功能. 如果使用PIL,这个需求只需要三行代码: from PIL import Image ...
- Python编码记录
字节流和字符串 当使用Python定义一个字符串时,实际会存储一个字节串: "abc"--[97][98][99] python2.x默认会把所有的字符串当做ASCII码来对待,但 ...
- Apache执行Python脚本
由于经常需要到服务器上执行些命令,有些命令懒得敲,就准备写点脚本直接浏览器调用就好了,比如这样: 因为线上有现成的Apache,就直接放它里面了,当然访问安全要设置,我似乎别的随笔里写了安全问题,这里 ...
- python开发编译器
引言 最近刚刚用python写完了一个解析protobuf文件的简单编译器,深感ply实现词法分析和语法分析的简洁方便.乘着余热未过,头脑清醒,记下一点总结和心得,方便各位pythoner参考使用. ...
- 关于解决python线上问题的几种有效技术
工作后好久没上博客园了,虽然不是很忙,但也没学生时代闲了.今天上博客园,发现好多的文章都是年终总结,想想是不是自己也应该总结下,不过现在还没想好,等想好了再写吧.今天写写自己在工作后用到的技术干货,争 ...
随机推荐
- Java实现第八届蓝桥杯承压计算
承压计算 题目描述 X星球的高科技实验室中整齐地堆放着某批珍贵金属原料. 每块金属原料的外形.尺寸完全一致,但重量不同. 金属材料被严格地堆放成金字塔形. 7 5 8 7 8 8 9 2 7 2 8 ...
- cocos2dx获得字体的宽高
Android: 1.在CCImage中添加下面的方法: //头文件声明略. cocos2d::CCSize CCImage::getStringSize(const char *text, cons ...
- 重学 Java 设计模式:实战组合模式(营销差异化人群发券,决策树引擎搭建场景)
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 小朋友才做选择题,成年人我都要 头几年只要群里一问我该学哪个开发语言,哪个语言最好. ...
- KVM虚拟机使用NAT+iptables做端口映射
环境介绍 有一个KVM宿主机,一个外网IP绑定在了宿主服务器上,但是希望直接用ssh访问上面的所有虚拟机,还想虚拟机提供外网服务, 解决方法如下: 环境为RHEL6.3,外网IP为 61.155.xx ...
- mui消息弹出确认框
var btnArray = ['以后再说', '前往添加']; mui.confirm('你需要即时添加员工才可正常使用', '添加员工', btnArray, function(e) { if ( ...
- rsyslog日志收集器
rsyslog详解(思维导图) 1. 日志收集概述 1.1 日志记录 时间 事件 1.2 日志收集器 syslog rsyslog elk stack 1.3 日志文件 文件记录的日志格式 其他日志文 ...
- mall
https://github.com/macrozheng mall整合OSS实现文件上传:https://blog.csdn.net/zhenghongcs/article/details/9931 ...
- Android选项卡学习
什么是选项卡 顶部的导航条就是选项卡了. Android开发中添加选项卡的步骤 图片不太懂上代码: activity_main.xml <?xml version="1.0" ...
- Ubuntu U盘启动出现“Failed to load ldlinux.c32”解决
最后用ultraISO软碟通,刻录映像时写入方式选择”RAW”,成功解决!!!
- Newtonsoft 六个超简单又实用的特性,值得一试 【上篇】
一:讲故事 看完官方文档,阅读了一些 Newtonsoft 源码,对它有了新的认识,先总结 六个超经典又实用的特性,同大家一起分享,废话不多说,快来一起看看吧~~~ 二:特性分析 1. 代码格式化 如 ...