python面试题精讲——逻辑运算and-or运算的本质

时间:2022-06-23
本文章向大家介绍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的本质依旧是逻辑运算,把握本质,怎么变化都不怕

猜您喜欢

往期精选▼

1. 全球裁员浪潮之下,武装自己或许比铁饭碗来得更加可靠!

2. 金三银四你值得拥有的全栈技术求职集锦

3. 空洞卷积的设计原理以及tensorflow和mxnet框架实现

4. 还没听过“无锚点框(no anchor)”的检测算法?看看这篇吧!

5.【开源资源】GitHub上深度学习模型压缩资源汇总

6.520福利来袭,一次性包邮送15本纸质书籍,满足你的需求!