Kodewick
第 7 课,共 31 课目录

布尔值和比较

第 7 课,共 31 课 · 第 1 部分 · 基础 · 约 15 分钟

程序要做选择,先得问一个只能答「是」或「不是」的问题:天黑了吗?灯油快用完了吗?Python 用两个值回答这类问题:True(真)或 False(假)。

main.py
1oil = 32print(oil < 5)3print(oil == 10)
输出
True
False

True 和 False

True 和 False 自成一种类型,叫 bool(布尔值)。它们和别的值一样,可以存进变量。首字母大写,不加引号。

main.py
1is_dark = True2print(is_dark)3print(type(is_dark))4print(type("True"))
输出
True
<class 'bool'>
<class 'str'>

加了引号的 "True" 只是一个四个字母的字符串。小写开头的 true,Python 根本不认识:

main.py
1lamp_on = true
输出
Traceback (most recent call last):
  File "main.py", line 1, in <module>
    lamp_on = true
NameError: name 'true' is not defined. Did you mean: 'True'?

发生了什么: Python 不认识「true」这个名字。可能是拼错了,或者用它之前还没给它赋值。

比较运算符

比较拿两个值来比,返回 True 或 False。

运算符意思例子结果
==等于3 == 3True
!=不等于3 != 3False
<小于2 < 5True
>大于2 > 5False
<=小于等于5 <= 5True
>=大于等于4 >= 5False
main.py
1houses = 122lamps = 93print(lamps < houses)4print(lamps >= houses)5print(houses != 12)6print(houses - lamps == 3)
输出
True
False
False
True

最后一行说明:先算数,再比较。12 - 9 是 3,3 == 3 是 True。

小技巧: 一个 = 是存值(x = 5),两个 == 是提问(x == 5)。把这两个弄混,是初学时最常见的错。

数字按大小比,int 和 float 可以随便比:5 == 5.0 是 True。

连写比较

想看一个值是不是在两个数之间,就像在纸上那样写。Python 把 0 < oil < 10 读成「0 < oil 并且 oil < 10」。

main.py
1oil = 72print(0 < oil < 10)3print(1 <= oil <= 5)4print(10 < oil < 0)
输出
True
False
False

很多别的语言要把两半分开写。在 Python 里,连着写才是常见写法。

比较字符串

字符串用 == 比,是看两个是不是一模一样,一个字符一个字符地比。大小写算数,空格也算数。

main.py
1print("lamp" == "lamp")2print("Lamp" == "lamp")3print("lamp " == "lamp")4print("Lamp".lower() == "lamp")
输出
True
False
False
True

< 和 > 比字符串,像查字典一样,从左往右一个字母一个字母地比。不过所有大写字母都排在小写字母前面,所以 "Zebra" < "apple"。汉字按编码比较,不是按拼音或笔画。

先猜一猜

这一行会显示什么?

1print("10" < "9")

字符串和数字永远不相等,而且 Python 不肯给它们排大小:

main.py
1print("5" == 5)2print("5" < 5)
输出
False
Traceback (most recent call last):
  File "main.py", line 2, in <module>
    print("5" < 5)
TypeError: '<' not supported between instances of 'str' and 'int'

发生了什么: 类型不对:拿了一种东西去做另一种东西才能做的事。

and、or、not

这三个词把 True 和 False 组合起来:

写法什么时候是 True
a and ba 和 b 都为真(并且)
a or b至少有一个为真(或者)
not aa 为假(不是)
main.py
1is_dark = True2has_oil = False3print(is_dark and has_oil)4print(is_dark or has_oil)5print(not has_oil)6print(is_dark and not has_oil)
输出
False
True
True
True

混在一起时,先算 not,再算 and,最后算 or。加上括号,人读起来也清楚:

main.py
1rain = True2wind = False3night = True4print(rain or wind and night)5print((rain or wind) and night)6print(not rain or night)
输出
True
True
True

真值和假值

Python 需要一个「是」或「不是」的时候,不光是 True 和 False,每个值都会被当成真或假。bool() 能看出是哪个。规则很短:零和空的是假,其他几乎都是真。

main.py
1print(bool(0), bool(0.0), bool(""), bool(None))2print(bool(42), bool(-1), bool("hi"), bool(" "))3print(bool("0"), bool("False"))
输出
False False False False
True True True True
True True

最后一行常常让人意外:"0" 和 "False" 是里面有字符的字符串,所以算真。第 8 课会用这一点写出很短的判断,比如「用户有没有输入东西」。

回答问题的方法返回的也是布尔值,所以可以和 and、or、not 一起用:

先猜一猜

这段代码会显示什么?

1text = "42"2print(text.isdigit() and "4" in text)

练一练

写好代码,点检查。提示随便看,实在想不出来再看答案。每道题显示一个布尔值:把 ... 换成一个表达式。

练习 1

油够不够

一盏灯至少要 4 份油。oil 够就显示 True,不够就显示 False。

要显示
True
exercise1.py
1oil = 42print(...)
输出
点「运行」或按 Ctrl+Enter
练习 2

营业时间

商店从 9 点开到 17 点(17 点整已经关门)。用一个连写比较,显示 hour 是不是在营业时间里。

要显示
False
exercise2.py
1hour = 172print(...)
输出
点「运行」或按 Ctrl+Enter
练习 3

Wick 能出门吗

天黑了并且没下雨,Wick 才出门。用下面的值显示结果。

要显示
False
exercise3.py
1is_dark = True2is_raining = True3print(...)
输出
点「运行」或按 Ctrl+Enter

这一课学会了

  • True 和 False 是 bool 的两个值:首字母大写,不加引号。
  • ==、!=、<、>、<=、>= 比较两个值,返回布尔值。= 是存值,== 是提问。
  • 0 < x < 10 这样连着写,一次就能看是否在范围内。
  • 字符串一模一样才相等,按字母一个一个比:大小写算数,而且 "10" < "9"。
  • and、or、not 组合布尔值;先算 not,再 and,最后 or。
  • 零、空字符串和 None 算假;其他几乎都算真。