在编程中,布尔逻辑可以说是无处不在的。它们是计算机运算的基础部分,掌握它们就跟学音乐掌握音阶一样重要。
在这个习题中,将在Python里使用前一个习题中学到的逻辑表达式。先为下面的每一个逻辑问题写出你的答案,每一题的答案要么为True
要么为False
。写完以后,在终端中启动Python,录入这些逻辑语句,确认你写的答案是否正确。
1.True and True
2.False and True
3.1 == 1 and 2 == 1
4."test" == "test"
5.1== 1 or 2 != 1
6.True and 1 == 1
7.False and 0 != 0
8.True or 1 == 1
9."test" == "testing"
10.1 != 0 and 2 == 1
11."test" != "testing"
12."test" == 1
13.not (True and False)
14.not (1 == 1 and 0 != 1)
15.not (10 == 1 or 1000 == 1000)
16.not (1 != 10 or 3 == 4)
17.not ("testing" == "testing" and "Zed" == "Cool Guy")
18.1 == 1 and not ("testing" == 1 or 1 == 0)
19."chunky" == "bacon" and not (3 == 4 or 3 == 3)
20.3 == 3 and not ("testing" == "testing" or "Python" == "Fun")
在这个习题结尾的地方我会给你一种帮助你理清复杂逻辑的技巧。
所有的布尔逻辑表达式都可以用下面的简单流程得到结果。
1.找到相等判断的部分(==
或!=
),将其改写为其最终值(True
或False
)。
2.找到括号中的and/or
,先算出它们的值。
3.找到每一个not
,算出它们取反的值。
4.找到剩下的and/or
,解出它们的值。
5.都做完后,剩下的结果应该就是True
或者False
了。
下面以第20个逻辑表达式演示一下:
3 != 4 and not ("testing" != "test" or "Python" == "Python")
接下来你将看到这个复杂的表达式是如何被逐级解为一个结果的。
1.解出每一个相等判断。
a. 3 != 4为True: True and not ("testing" != "test" or "Python"
== "Python")
b. "testing" != "test"为True: True and not (True or "Python" ==
"Python")
c. "Python" == "Python"为True: True and not (True or True)
2.找到括号中的每一个and/or
。
(True or True)为True: True and not (True)
3.
找到每一个not
并将其取反。
not (True)为False: True and False
4.
找到剩下的and/or
,解出它们的值。
True and False为False
这样我们做完了,知道了它最终的值为False
。
警告
复杂的布尔逻辑表达式一开始看上去可能会让你觉得很难。你也许已经碰壁过了,不过别灰心,这些“逻辑体操”式的训练只是让你逐渐习惯起来,以便后面你可以轻松应对编程里边更酷的一些东西。只要坚持下去,不放过自己做错的地方就行了。如果你暂时不太理解也没关系,最终总是会弄懂的。
应该看到的结果
在你尝试过猜测结果以后,就来看看Python会话中得到的结果。
$ python3.6
Python 2.5.1 (r251:54863, Feb 6 2009, 19:02:12)
[GCC 4.0.1 (Apple Inc. build 5465)] on Darwin
Type "help", "copyright", "credits" or "License" for more information.
>>> True and True
True
>>> 1 == 1 and 2 == 2
True
巩固练习
1.Python里还有很多和!=
和==
类似的操作符。试着尽可能多地列出Python中的“相等运算符”,如<
或者<=
。
2.写出每一个“相等运算符”的名称,如!=
叫“不等于”。
3.在Python中测试新的布尔运算符。在按回车键前你需要说出它的结果。不要思考,凭自己的第一感觉就可以了。把表达式和结果用笔写下来再按回车键,最后看自己做对多少,做错多少。
4.把习题3中写的那张纸丢掉,以后你再也不需要查它了。
常见问题回答
为什么"test" and "test"
返回"test"
,1 and
1返回1,而不是返回True
呢?
Python和很多编程语言一样,都是给布尔表达式返回两个被操作对象中的一个,而非True
或False
。这意味着,如果你写了False and 1
,得到的是第一个操作数(False
),而非第二个操作数(1
),但如果你写的是True and 1
,得到的是第二个操作数(1
)。多做几个实验。
!=
和<>
有何不同?
在Python中!=是主流用法,<>
将被逐渐废弃,所以你应该使用前者,除此以外没什么不同。
有没有短路逻辑?
有的。任何以False
开头的and
语句都会直接处理成False
,不会继续检查后面的语句。任何包含True
的or
语句,只要处理到True
,就不会继续向下推算,而是直接返回True
了。不过,还是要确保你能理解整个语句,因为日后这会很有用。
本文摘自《笨办法学Python 3》
在本书中,你将通过完成52个精心设计的习题来学会Python语言。阅读这些习题,照着录入代码(不要复制和粘贴!),修正自己的错误,观察程序的运行。在这个过程中,你将学会计算机的工作原理,知道怎样的程序才算是好程序,以及如何读、写和思考代码。作者还提供了5个多小时的视频,教你如何破坏、修正和调试代码,整个过程就像一边做题一边直播一样。一开始会很难,但很快你就会上手,并且会感觉很棒!
本书适合以下人群阅读
● 零编程经验的初学者
● 了解一两门编程语言的初级人员
● 多年未写过代码的转岗专业人员
● 有丰富的编程经验,想通过快速、简单的速成课程了解Python 3的专业人员