Skip to content

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 运行本节的例子。