python面试题精讲——逻辑运算and-or运算的本质
前言
python的and、or逻辑运算是非常基础的应用,但是你真的明白它们组合起来运算的本质吗,有的人说and-or是python里面的三元运算符,这种说法正确吗?下面就从基本知识入手,详细说明Python逻辑运算的本质。这个题目来自于Python面试题,但是我说的很详细而已,一个题讲了一篇。
目录
一、and、or、and-or高级应用
1.1 多个and并列
1.2 多个or并列
1.3 and-or并列
1.4 总结
一、and、or、and-or高级应用
此即为所谓的逻辑运算符,我们在判断条件的时候,常常会遇到下面的下面这样的判断方法:
if condition_expression1 and condition_expression2:
或者是:
if condition_expression1 or condition_expression2:
这种简单的我们都会,但是他还有更加高级的用法哦!
1.1 多个and并列
在python中,and自左向右扫描布尔表达式,如果所有值为真,则返回最后一个为真的表达式,如果为假,则返回第一个为假的表达式,
一般的格式如下:
cond_exp1 and cond_exp2 and cond_exp3 and cond_exp4
例如:
In [1]: e=2 and 1 and 3 and 4
In [2]: e #因为2、1、3、4均为True,返回最后一个为True的,即4
Out[2]: 4
In [3]: e=2 and 1 and 0 and 4
In [4]: e #因为中间的0为False,故而返回第一个为False的,即0
Out[4]: 0
In [5]: f=1<2 and 2<3 and 3<4
In [6]: f #因为1<2、2<3、3<4均为True,返回最后一个为True的,即3<4,而3<4本身是布尔表达式,故而为True
Out[6]: True
In [7]: f=1<2 and 2<3 and 3>4 and 5
In [8]: f #因为1<2、2<3为真,中间的3>4为False,返回第一个为False的,即3>4,而3>4本身是布尔表达式,故而为False
Out[8]: False
1.2 多个or并列
or的使用与and正好相反,自左向右计算整个布尔表达式,如果有为真的值,那么立刻返回第一个为真的值,如果整个表达式为假,则返回最后一个为假的值,一般格式如下:
cond_exp1 and cond_exp2 and cond_exp3 and cond_exp4
例如:
In [9]: e= 2 or 1 or 3 or 4
In [10]: e #因为2、1、3、4均为True,返回第一个为True的,即2
Out[10]: 2
In [14]: e= 0 or 0 or 0 or 0
In [15]: e #因为所有的0为False,故而返回最后一个为False的,即0
Out[15]: 0
In [16]: f=1<2 or 2<3 or 3<4 or 4<5
In [17]: f #因为1<2、2<3、3<4、4<5均为True,返回第一个为True的,即1<2,而1<2本身是布尔表达式,故而为True
Out[17]: True
In [18]: f=1>2 or 2>3 or 3>4 or 4>5
In [19]: f #因为1>2、2>3、3>4、4>5为假,所以返回最后一个为False的,即4>5,而4>5本身是布尔表达式,故而为False
Out[19]: False
1.3 and-or并列
前言:Python中,没有像
cond_expression?expression1:expression2
这样的三元运算符,但是由于Python语法上的灵活,我们称下面的语句为python的三元运算符,即:
expression if condition_expression1 else expression2
但是这个我们今天不说,今天说一下使用and-or 依然可以实现三元运算类似的效果,
In [1]: a="hello"
In [2]: b="world"
In [3]: c=1 and a or b #等价于 True and a or b
In [4]: c
Out[4]: 'hello'
In [5]: c=0 and a or b #等价于 False and a or b
In [6]: c
Out[6]: 'world'
从效果上来看这跟三元运算确实很像,虽然看起来效果确实是三元运算,但是需要注意的是跟前面的多个and,多个or一样,and、or 、and-or它们连接的一定是条件表达式,单独的一个数字、一个变量、一个字符串都是转化为条件表达式之后来解析的,这涉及到其它数据类型与bool类型之间的转换。所以下面来分析一下and-or的本质
In [1]: a="hello"
In [2]: b="world"
In [3]: c=1 and a or b #等价于 True and a or b
In [4]: c
Out[4]: 'hello'
解析:因为1是True、a="hello"转化为bool类型也为True,先运算
1 and a,两个True进行and运算,根据前面讲的规则返回最后一个True,即返回a,因为a是True,b="world"也是True,两个True进行or运算,返回第一个,即返回a,这就是为什么最后返回a的原因了。
再看一下下面这个:
In [5]: c=0 and a or b #等价于 False and a or b
In [6]: c
Out[6]: 'world'
解析:因为0是False、a="hello"转化为bool类型也为True,先运算
0 and a,一个False和一个True进行and运算,根据前面讲的规则返回第一个False,即返回0,又因为b="world"也是True,一个False和一个True进行or运算,返回第一个为真的结果,即返回b,这就是为什么最后返回b的原因了。
再看一下下面这个:
In [7]: a=0
In [8]: b=1
In [9]: c=True and a or b
In [10]: c
Out[10]: 1
In [11]: c=False and a or b
In [12]: c #为什么依然返回1呢?
Out[12]: 1
解析:因为a=0,即a为False,当前面的条件为True的时候,True与False进行and运算,返回False,即a,当前面的条件为False的时候,False与False进行or运算,还是返回最后的那个False,即a,无论最前面的是True还是False,第一个返回的总是a,因为a为False,在与后面的b进行or运算,当b是真的时候,返回b,当b为False的时候还是返回b,所以出现了上面的结果。
问题:只要and-or中间的那个表达式转化成bool类型之后是False,无论and前面和or后面是什么,最终的结果必然是返回or后面的b,这就失去了三元运算的效果。
为了解决这样的问题该怎么办呢?
我们可以这样做
解决办法:
根据上面的分析我们知道,解决这个问题的关键是在与如何保证and-or中间的那个表达式为True才行,所以我们可以将中间的那个表达式作为列表的一个元素,无论这个元素是真是假,列表总是不会为空的,也就不会为False,也就保证了and-or中间的部分为True,如下所示:
cond_expr1 and [cond_expr2] or cond_expr3 #将and-or中间的表达式用列表包装,保证为True
看下面的例子:
In [7]: a=0
In [8]: b=1
In [13]: d=True and [a] or b
In [14]: d #返回的虽然不是a,二十[a],但是已经到到了三元运算的效果
Out[14]: [0]
In [15]: d=False and [a] or b
In [16]: d #返回的是b
Out[16]: 1
这就实现了使用and-or语句实现三元运算的目的。
1.4 总结
需要注意的是,我们是根据逻辑分析,让and-or语句达到三元运算的效果,但是本质上来说它并不是三元运算符哦,其实无论怎么组合,我们记住and和or运算的一般原则即可,这是1.1和1.2里面所说的内容,正所谓万变不离其宗,and-or的本质依旧是逻辑运算,把握本质,怎么变化都不怕!
猜您喜欢
往期精选▼
3. 空洞卷积的设计原理以及tensorflow和mxnet框架实现
4. 还没听过“无锚点框(no anchor)”的检测算法?看看这篇吧!
6.520福利来袭,一次性包邮送15本纸质书籍,满足你的需求!
- ASP.NET MVC4 Web API 堆栈将添加指定消息处理功能
- 页面copyright部分始终居于页面底部
- Hammock for REST
- 网页超过一屏时自动浮动在网页最上方的图层特效
- 关于gcc、glibc和binutils模块之间的关系
- 贝叶斯过滤算法
- 強大的jQuery Chart组件-Highcharts
- vue2.0 配置 选项 属性 方法 事件 ——速查
- 亲密接触IIS 8和Web Deploy 3.0
- vue2.0 组件通信
- 在MongoDB中实现聚合函数
- 原生JS编写的照片墙效果实例演示特效
- 使用SuperWebSocket 构建实时 Web 应用
- Vue2.0的变化 ,组件模板,生命周期,循环,自定义键盘指令,过滤器
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法