更多课程 选择中心


Python培训

400-996-5531

Python逻辑运算and-or运算的本质

  • 发布:Python培训
  • 来源:机器学习与python集中营
  • 时间:2019-10-09 13:22

一、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]: cOut[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的本质依旧是逻辑运算,把握本质,怎么变化都不怕!

免责声明:内容和图片源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

预约申请免费试听课

填写下面表单即可预约申请免费试听! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:Python 中 (&,|)和(and,or)之间的区别
下一篇:Python读取Excel表格

2021年Python全套免费视频教程在哪里?

Python编程学习路线

Python最高有几级?

人工智能与语音遥控的区别?

Copyright © 2023 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省