布尔值和比较
程序要做选择,先得问一个只能答「是」或「不是」的问题:天黑了吗?灯油快用完了吗?Python 用两个值回答这类问题:True(真)或 False(假)。
1oil = 32print(oil < 5)3print(oil == 10)
True False
True 和 False
True 和 False 自成一种类型,叫 bool(布尔值)。它们和别的值一样,可以存进变量。首字母大写,不加引号。
1is_dark = True2print(is_dark)3print(type(is_dark))4print(type("True"))
True <class 'bool'> <class 'str'>
加了引号的 "True" 只是一个四个字母的字符串。小写开头的 true,Python 根本不认识:
1lamp_on = trueTraceback (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 == 3 | True |
!= | 不等于 | 3 != 3 | False |
< | 小于 | 2 < 5 | True |
> | 大于 | 2 > 5 | False |
<= | 小于等于 | 5 <= 5 | True |
>= | 大于等于 | 4 >= 5 | False |
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」。
1oil = 72print(0 < oil < 10)3print(1 <= oil <= 5)4print(10 < oil < 0)
True False False
很多别的语言要把两半分开写。在 Python 里,连着写才是常见写法。
比较字符串
字符串用 == 比,是看两个是不是一模一样,一个字符一个字符地比。大小写算数,空格也算数。
1print("lamp" == "lamp")2print("Lamp" == "lamp")3print("lamp " == "lamp")4print("Lamp".lower() == "lamp")
True False False True
< 和 > 比字符串,像查字典一样,从左往右一个字母一个字母地比。不过所有大写字母都排在小写字母前面,所以 "Zebra" < "apple"。汉字按编码比较,不是按拼音或笔画。
这一行会显示什么?
1print("10" < "9") 这是两个字符串,不是数字,所以 Python 先比第一个字符:"1" 排在 "9" 前面。它不会把整个数看一遍。要比较数量,先用 int() 把输入转换成数字。
字符串和数字永远不相等,而且 Python 不肯给它们排大小:
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 b | a 和 b 都为真(并且) |
a or b | 至少有一个为真(或者) |
not a | a 为假(不是) |
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。加上括号,人读起来也清楚:
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() 能看出是哪个。规则很短:零和空的是假,其他几乎都是真。
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)
text.isdigit() 是 True,"4" in text 也是 True。两边都为真,所以 and 给出 True。
练一练
写好代码,点检查。提示随便看,实在想不出来再看答案。每道题显示一个布尔值:把 ... 换成一个表达式。
油够不够
✓一盏灯至少要 4 份油。oil 够就显示 True,不够就显示 False。
True
1oil = 42print(...)
营业时间
✓商店从 9 点开到 17 点(17 点整已经关门)。用一个连写比较,显示 hour 是不是在营业时间里。
False
1hour = 172print(...)
Wick 能出门吗
✓天黑了并且没下雨,Wick 才出门。用下面的值显示结果。
False
1is_dark = True2is_raining = True3print(...)
这一课学会了
True和False是bool的两个值:首字母大写,不加引号。==、!=、<、>、<=、>=比较两个值,返回布尔值。=是存值,==是提问。0 < x < 10这样连着写,一次就能看是否在范围内。- 字符串一模一样才相等,按字母一个一个比:大小写算数,而且
"10" < "9"。 and、or、not组合布尔值;先算not,再and,最后or。- 零、空字符串和
None算假;其他几乎都算真。