if 判断
if 用来在条件成立时执行一段代码。常常和 else、elif 一起用,从几条路里选一条。
和 for 循环 一样,if 那一行以冒号结尾,要执行的语句放在缩进里。
为什么需要判断
循环负责重复。判断负责分岔:成绩够不够、输入是不是空的、这个数是不是要跳过。没有判断,程序就只能把每条数据都走同一条路。
条件成立就执行
a = 5
if a > 1:
print(a)
a > 1 成立,所以打印:
5
条件不成立时,缩进的代码整段跳过,程序继续往下走,也不报错。
缩进决定哪些语句属于 if
a = 5
if a > 1:
b = a
print(b)
c = b
print(c)
5
5
b = a 和 print(b) 缩进在 if 下面,只有条件成立才执行。c = b 和 if 对齐,跟条件没有关系,总会执行。这里因为条件成立,b 已经有值,所以后面能用。
条件不成立会怎样
把条件改成一个不成立的比较。b = a 被跳过,b 这个名字根本没被创建:
a = 5
if a > 6:
b = a
print(b)
c = b
NameError: name 'b' is not defined
后面的 c = b 仍会执行,于是报错。缩进里面赋值的名字,不能假设外面一定用得上。需要的话,在 if 前面先给 b 一个默认值,或者用 else 保证两条路都会赋值。
这段单独运行会停在 c = b。examples/if.py 里没有放它,避免把后面的例子一起打断。
比较
常用的比较:
| 写法 | 含义 |
|---|---|
== |
相等 |
!= |
不相等 |
> >= |
大于、大于等于 |
< <= |
小于、小于等于 |
print(1 == 1)
print(1 != 2)
print(5 > 1)
True
False
True
一个等号 = 是赋值,两个等号 == 才是比较。条件里写成赋值,会直接语法错误:
a = 1
if a = 1:
print(a)
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?
入门先改成 ==。
Python 可以把比较连着写,读起来和数学式一样。60 <= score < 90 表示 score 不小于 60,并且小于 90。
score = 75
print(60 <= score < 90)
True
数字和字符串不能比大小。"3" == 3 也不成立:一个是字符串,一个是整数,类型不同就是不相等。
print("3" == 3)
print(3 > "a")
False
TypeError: '>' not supported between instances of 'int' and 'str'
and、or、not
一条 if 里可以组合几个条件。
and:两边都成立,整个才成立or:至少一边成立就成立not:把成立翻转成不成立
age = 20
print(age >= 18 and age < 60)
print(age < 18 or age >= 60)
print(not age >= 18)
True
False
False
把它们放进 if,才能看到走了哪一条分支。and 要两边同时成立。年龄够了但还要看成绩:
age = 20
score = 80
if age >= 18 and score >= 60:
print("可以报名")
else:
print("不能报名")
可以报名
年龄改成 16,成绩仍然是 80。and 有一边不成立,整个条件就不成立:
age = 16
score = 80
if age >= 18 and score >= 60:
print("可以报名")
else:
print("不能报名")
不能报名
or 只要有一边成立即可。周六或周日都休息:
day = "周六"
if day == "周六" or day == "周日":
print("休息")
else:
print("上课")
休息
day = "周一"
if day == "周六" or day == "周日":
print("休息")
else:
print("上课")
上课
not 把结果反过来。还没登录时,logged_in 是假,not logged_in 就是真:
logged_in = False
if not logged_in:
print("请先登录")
请先登录
判断某个值在不在序列里,用 in:
if "a" in ["a", "b"]:
print("在里面")
在里面
else 和 elif
if 后面可以接 elif(否则如果)和 else(否则)。条件从上往下看,第一条成立的会被执行,剩下的全部跳过。
score = 75
if score >= 90:
print("优秀")
elif score >= 60:
print("及格")
else:
print("不及格")
及格
75 不够 90,第一条跳过。75 达到 60,打印“及格”,最后的 else 不再看。
顺序会改变结果。如果先判断及格,90 分以上也会被这条拦住,永远走不到“优秀”:
score = 95
if score >= 60:
print("及格")
elif score >= 90:
print("优秀")
else:
print("不及格")
及格
更严的条件要写在前面。这里应先写 score >= 90,再写 score >= 60。
哪些值当作假
if 后面不一定是比较式。Python 会把一些值直接当成不成立:
- 数字
0 - 空字符串
"" - 空列表
[]、空字典{} None
其他常见的值,比如非 0 数字、非空字符串、非空列表,都当成成立。
name = ""
if name:
print(name)
else:
print("名字是空的")
名字是空的
name = "Jike"
if name:
print(name)
Jike
所以“有没有输入”“列表是不是空的”,常常直接写 if name:、if items:,不必先和 "" 或 [] 比较。
和 for 配合
上一节的 break 已经用过一次。再看一个累加:数一数有多少个及格的成绩。
scores = [58, 76, 90, 61]
passed = 0
for score in scores:
if score >= 60:
passed = passed + 1
print(passed)
3
if 缩进在 for 里面,每个成绩都会判断一次。passed 仍要放在循环外面。
和 while 配合
while 用的判断和 if 是同一种:条件成立就执行缩进的代码。差别是 while 做完一轮还会回来再判断一次,直到条件不成立。它的基本写法在 for 循环 里。
放在一起时,两人分工不同。while 决定还要不要继续转,if 决定这一圈走哪条路。
n = 1
while n <= 4:
if n % 2 == 0:
print(n, "偶数")
else:
print(n, "奇数")
n = n + 1
1 奇数
2 偶数
3 奇数
4 偶数
n % 2 == 0 表示 n 除以 2 的余数是 0,也就是偶数。每一圈先由 while 看 n <= 4,再由 if 决定打印“偶数”还是“奇数”。循环最后要写 n = n + 1,否则 n 一直是 1,条件永远成立。
and、or 也可以直接写在 while 的条件里。下面两个条件都成立才继续;n 变成 3 时,n != 3 不成立,循环就停:
n = 0
while n < 5 and n != 3:
print(n)
n = n + 1
0
1
2
只有两种结果时可以写在一行
score = 75
text = "及格" if score >= 60 else "不及格"
print(text)
及格
这叫条件表达式:成立时取 if 前面的值,否则取 else 后面的值。它适合很短的二选一。分支一多,还是写成 if / elif / else,每一条路各自占一行。
Python 3.10 起可以用 match
3.12 也可以用 match / case,拿一个值去和几种固定情况比较:
op = "+"
match op:
case "+":
print(1 + 2)
case "-":
print(1 - 2)
case _:
print("未知运算")
3
case _ 相当于“其他情况”,和 else 类似。上面这个例子用 if / elif / else 写也同样清楚。
入门阶段把 if / elif / else 写熟即可。match 以后见到能看懂就行,适合一个值要分成很多固定分支的时候。
常见坑
把 = 写成比较。 条件里用 ==。if a = 1 是语法错误。
elif 的顺序写反。 先匹配到的那条会把后面全部挡住。范围越窄的条件越要放前面。
类型不同还去比大小。 先确认两边都是数字,或都是字符串。用户输入进来的通常是字符串,和整数比之前要先转换。转换见后面的 常用内置函数。
以为缩进外面的代码也受条件保护。 和 if 对齐的语句总会执行。只在条件成立时才该出现的名字,要放在缩进里,或者事先给好默认值。
小结
if条件成立才执行缩进的代码elif从上往下只走第一条成立的,else负责剩下的情况- 比较用
==,赋值用= and、or、not用来组合条件,in用来判断成员0、空字符串、空列表、None在条件里当作不成立- 和
for、while嵌套时,看清每一层缩进属于谁 while决定是否继续,if决定这一圈走哪条路
下一节学习 切片。用 python examples/if.py 运行本节的例子。