第5章 if 语句
实际应用中,很多时候需要通过条件判断的结果,决定采取怎样的措施。if语句就适用于条件判断的。并根据判断结果执行不同的程序语句。
5.1 一个简单示例
先看一个简单的if语句示例,下面for循环代码中加入了if语句,来判断当前循环中变量airen的值是否为’laopo’,如果是,输出首字母大写的字符串,如果不是,则原样输出列表元素的全小写字符。
airenmen=['laopo','erzi','mama']
for airen in airenmen :
# 循环过程中检查变量是否等于laopo,是则输出首字母大写。
if airen=='laopo' :#条件判断的等于符号是 == ,而不是 = 。
print(airen.title())
else:
print(airen)
输出结果为:
Laopo
erzi
mama
条件判断有多种符号,判断是否相等的符号是
==
,而不是=
。可以理解为=
用于表达关联,而==
用于表示提问并要求答案。
5.2 条件测试
if语句的核心是一个值为True或False的表达式,当测试结果为True时,执行if语句后的代码;当测试结果为False时,则忽略if语句后的代码;如果有else语句,Flase时会执行else语句后的代码。
if 条件表达式 :
执行语句
else :
执行语句
其实,if语句要完成的就是运算符两边的比较测试。条件测试运算符(也称比较运算符、二元运算符)有多种:
- 等于
==
- 不等于
!=
- 大于
>
- 大于等于
>=
- 小于
<
- 小于等于
<=
- 包含
in
- 不包含
not in
- …
5.2.1 检查是否相等
最简单的是检查是否相等,使用运算符==
来比较两边的值是否完全一致。
下面的代码会检查变量最爱的值是否为'laopo'
,因为默认存在大小写敏感,所以第一句会返回False,而第二句==两边完全一致,则返回True。
zuiai='LaoPo'
print(zuiai=='laopo')
print(zuiai=='LaoPo')
5.2.2 检查字符串时忽略大小写
有时候只需要检查内容是否一致,而并不需要检查是否连大小写都完全一致,在对字符串进行判断时,就需要忽略大小写,或者说,先统一大小写,再进行比较。
下面的例句,由于用了lower()方法,所以是在临时转换小写后比较,只判断字符内容是否一致,而不考虑大小写。
print(zuiai.lower() == 'laopo')
与我而言,实际应用中的字符串基本都是汉字,大小写敏感并不常见。
5.2.3 检查是否不等
有时候,直接检查是否不等,比检查是否相等更有效率。是否不等的运算符是!=
。
下面例子,检查shihao的值是否为'抽烟'
,如果不是,则检查结果返回True
,执行if后面的语句;如果值是‘抽烟’,对于!=
而言会返回Flase
,执行else后面的语句。
shihao='喝酒'
if shihao != '抽烟' :
print(f"{shihao}并不是我的最大不良嗜好!")
else:
print(f"抽烟比喝酒更危害健康!")
注意!if语句比较结果返回的值True或False取决于运算符及其两边的值。
5.2.4 数值比较
数值比较很简单,等于、不等于、大于、小于、大于等于、小于等于,都可以进行判断比较。
下面的例子判断数字值的大小来确定一个孩子是否已经成年。
age=16
if age >= 16 :
print(f"他已经是个成年人了,不能总是这么任性!")
else:
print(f"他还小,要给他犯错的机会。")
5.2.5 同时检查多个条件
很多时候,简单判断一个条件是没有实用价值的,往往需要同时满足几个条件来筛选需要的东西。and
和or
发挥这样的用途。
用
and
可以连接多个检查条件,满足全部条件时返回True,否则返回False。
if 条件表达式1 and 条件表达式2 :
下面例子判断两个孩子是否都已成年,并通过修改值来看True和False时不同的结果。
age0,age1=16,18
if (age0 >= 16) and (age1 >= 16) :
print(f"两个孩子均已成年。")
else:
print(f"他们并未全部成年。")
#修改age0的值后,可见返回Flase的输出结果。
age0=15
if (age0 >= 16) and (age1 >= 16) :
print(f"两个孩子均已成年。")
else:
print(f"他们并未全部成年。")
为了增强可读性,每个条件表达式可用()
包围起来,但这不是必须的。
而
or
连接的多个检查条件中,只要满足一个条件就返回Ture,只有当所有条件都不满足,才返回False。
age0,age1=15,18
if age0>=16 or age1 >= 16 :
print(f"他们并未全部成年,不能一起去网吧。")
else:
print(f"他们全部未成年,谁都不能去!")
#修改age1后,两个条件都不满足,返回False。
age1=14
if age0>=16 or age1 >= 16 :
print(f"他们并未全部成年,不能一起去网吧。")
else:
print(f"他们全部未成年,谁都不能去!")
5.2.6 检查值是否在列表中
有时候需要确定一个值是否存在于列表中,则使用in
来实现。
if 变量名 in 列表名 :
下面例子检查变量airen的值是否属于airenmen中的一个。
airenmen=['laopo','erzi','mama']
airen='laopo'
if airen in airenmen :
print(f"{airen.title()}是我爱的人之一。")
5.2.7 检查值是否不在列表中
而not in
则用于检查一个特定值是否不在列表中,就像!=
一样,有时候检查是否不存在,比检查是否存在更有效率。
airenmen=['laopo','erzi','mama']
airen='nobody'
if airen not in airenmen :
print(f"不,{airen.title()}不是我的爱人。")
5.2.8 布尔表达式
布尔表达式其实就是条件测试表达式的另一种叫法,与条件表达式一样,返回结果要么是True,要么是False。
布尔值用于记录条件,在跟踪程序状态或其他重要方面布尔值是一种高效方法。
ShengHuoBuYi = True
QinLaoZhiFu = False
5.3 if语句
if语句有很多种,如何选择取决于要测试的条件数量和逻辑结构。
5.3.1 简单的if语句
最简单的if语句只有一个条件测试和一个执行语句,如下例,只检查年龄是否大于等于16岁,如果是则返回True
并执行紧跟if语句的执行语句,如果否则返回False
并忽略紧跟if的执行语句。对于下面例子而言,会输出已成年,如果修改age变量值使其小于16岁,则条件测试为Flase,则程序结束,不会输出任何结果。
age = 18
if age >= 16 :
print(f"已满16岁")
在if语句中,同样使用缩进来确定语句的归属,if语句可以是任意测试条件,而if语句后的执行语句可以是任意代码,并且可以有任意多行。上面例子可以增加更多输出内容。
age = 18
if age >= 16 :
print(f"已满16岁")
print(f"\t已经成年")
两个print()
都在if语句后面,且都缩进了一段,所以都会被执行。
5.3.2 if-else语句
常用的情况是如果True执行一些语句,如果Flase则执行另一些语句。if-else
语句会实现测试结果False时也有代码可执行,让测试结果非真的时候也能进行一些相应的处理。下面例子在未成年时也有语句会被执行,也有输出结果。
age = 18
if age >= 16 :
print(f"已满16岁,已成年。")
else :
print(f"未满16岁,尚未成年。")
这里,通过判断变量age
的值是否大于等于16,如果True
会执行if
后的语句,输出已成年信息;如果False
则忽略if后语句,并执行else
后语句,输出未成年信息。很多时候,没有else的if语句在执行过程中会遇到意想不到的问题,应该让if语句尽量带有else以便处理Flase时的情况。
5.3.3 if-elif-else语句
if 测试条件1 :
执行语句1
elif 测试条件2 :
执行语句2
else :
执行语句3
记得以前学过的语言中有的用
elseif
作为关键字,Python做了进一步简化。
还有一些情况,只检查一个条件式不够的,需要对同一事物执行至少3种情况的检查。如买车票时会出现这样的3种情况:1,成年人全价票;2,儿童半价票;3,婴幼儿免票。那么根据需要和实际遇到的情况,代码如下:
age = 10
if age < 6 :
print(f"\t未满6岁,婴幼儿免票。")
elif age <= 14 :
print(f"\t未满14岁,儿童享受半价票。")
else :
print(f"\t无优惠,请购买全价票。")
上例中,首先测试是否满足第一个条件,如果年龄小于6,则执行if
后语句,忽略其他部分;如果第一个测试为False
,则忽略if后语句,继续执行第二项测试,即elif
项的测试,若满足该项则执行其后语句,输出半价票信息,并忽略else部分;若前两项都不满足,则说明年龄已经超过6岁,也超过14岁,属于除前两种条件外的其他情况,此时Python会执行else
后的语句。
统一输出格式,将
print()
从if
语句块中移出,可以使代码更简洁。因统一了输出结构,修改输入语句时只需修改一处代码,而不是3处。上例修改后如下:
age = 10
if age < 6 :
piaojia='免票'
elif age <= 14 :
piaojia='半价票'
else :
piaojia='全价票'
print(f"乘客年龄:{age}\t票价:{piaojia}")
5.3.4 多个elif代码块
根据实际需要,可以增加多个elif
代码块,以增加更多测试条件,上例可以进一步调整为如下这样,给年龄满65岁的老人也提供半价优惠:
age = 67
if age < 6 :
piaojia='免票'
elif age <= 14 :
piaojia='半价票'
elif age >= 65 :
piaojia='半价票'
else :
piaojia='全价票'
print(f"乘客年龄:{age}\t票价:{piaojia}")
5.3.5 省略else部分
在if语句的完整结构中,else
部分是可以根据需要来使用的,如果不需要,可以没有。值得注意的是,else是很强大的,只要有他在,即使前面的无论多少个测试条件都不满足,程序也一定会给出一个执行结果。
所以,是否写else还是根据实际情况来,我个人的习惯是只要有可能出现所有条件都不被满足,就一定写个else,给自己个测试提示也好。
5.3.6 测试多个条件
当仅需检查,是否满足一系列条件中的一个即可,使用if-elif-else
语句;但有时,需要检查是否不止满足一个条件,这种情况,需要使用一系列的if
语句,而不是一个if-elif-else语句。例如,需要在发货前确认客户需求的品种是否都有现货。
xianhuo=['apple','banner','cherry']
if 'apple' in xianhuo :
print(f"\t苹果有货,可发。")
if 'banner' in xianhuo :
print(f"\t香蕉有货,可发。")
if 'cherry' in xianhuo :
print(f"\t樱桃有货,可发。")
5.4 用if语句处理列表
5.4.1 检查特殊元素
根据列表中的不同元素值,确定适合的处理方式。依然是水果店的例子,来看如何通过循环检查并输出打包配送单据。
下面例子使用循环输出客户的订单,但并不判断是否能满足需求。
xianhuo=['苹果','香蕉','樱桃']
for dabao in xianhuo :
print(f"准备打包:{dabao}\t")
print(f"订单明细结束。")
这里有一个明显的问题,如果客户要求的水果是已知暂不销售的品种呢?该如何处理?要不要继续打包?还是要询问客户?可在for循环中增加一条if语句来处理这种情况。
xianhuo=['苹果','香蕉','西瓜','樱桃']
for dabao in xianhuo :
if dabao == "西瓜" :
print(f"\t本店暂不供应'{dabao}',务必及时告知客户。")
else :
print(f"准备打包:{dabao}")
print(f"订单明细结束。\n")
上例在循环中增加了判断,以确定客户订单中是否含有暂不供应的西瓜,如果有则输出相关信息给工作人员,以便与客户确认是否继续订单,其他正常供应的水果则输出订单明细,准备打包。
5.4.2 确定非空列表
之前的例子中都假设列表中至少有一个元素,但实际上很多时候在程序开始执行前,面对的可能是一个空列表。例如,在循环开始前应先确定客户的需求列表列表是否为空,如果为空则无法下单。
dingdan=[]
if dingdan :
for dabao in dingdan :
#列表非空时,返回True,执行if后语句。
print(f"准备打包:{dabao}")
print(f"订单明细结束。")
else:
#列表为空时,返回False,执行else后语句。
print(f"\t请先确定订单内容。\n")
5.4.3 使用多个列表
实际应用中,最常见的是获取用户订单,然后去跟库存列表进行比较,以确定用户需求的是否都有现货。也就是说有两个列表,一个是客户的需求,一个是现有的品种。通过比较,来确定是否满足客户订单需求,并给出如果不满足时的处理方式。
xianhuo=['苹果','香蕉','樱桃']
dingdan=['苹果','西瓜','樱桃']
for dabao in dingdan :
if dabao in xianhuo :
print(f"准备打包:{dabao}")
else:
print(f"'{dabao}'暂无现货,务必与客户核实是否继续订单。")
print(f"订单明细结束。\n")
5.5 设置if语句的格式
在使用if语句等设计运算符的格式时,在运算符两边或冒号:的两边增加一个空格 ,并不会影响Python的执行,却能够让语句更易读。如:if age >= 16 :
要比if age>=16:
更易读,尤其是在复杂的语句中更是如此。
如果顺利的话,我希望我编写的第一个真实可用的Python程序是一个家庭消费记事本。
本章习题
从本章开始,逐渐变得复杂起来,所以把相关习题也记录下来。下面是本章的几个习题代码段,根据教程要求尝试练习,留作参考。
习题 5.8 对管理员使用不同的问候语
users=['aliye','boton','carina','discas','eliy']
user='aliye'
if user == 'discas':
print(f"管理员{user.title()}你好!是否需要查看近期统计表?")
else:
print(f"亲爱的{user.title()}你好!欢迎回来!")
print(f"登录成功!\n")
user='discas'
if user == 'discas':
print(f"管理员{user.title()}你好!是否需要查看近期统计表?")
else:
print(f"亲爱的{user.title()}你好!欢迎回来!")
print(f"登录成功!\n")
习题 5.9 检查已有用户列表是否为空
users=['aliye','boton','carina','discas','eliy']
user='aliye'
if users :
print(f"亲爱的{user},你好!欢迎回来!")#列表非空时为True,执行if。
else:
print(f"当前无任何已注册用户,请先核实。")#列表为空时返回Flase,执行else。
users=[]
user='aliye'
if users :
print(f"亲爱的{user},你好!欢迎回来!")#列表非空时为True,执行if。
else:
print(f"当前无任何已注册用户,请先核实。")#列表为空时返回Flase,执行else。
习题 5.10 检查新注册用户名是否与现有用户名冲突(不区分大小写)
users = ['Aliye','Boton','Carina','Discas','Eliy']
oldusers=[]
newusers =['jack','boton','maykic','eliy']
print(users)
for olduser in users :
oldusers.append(olduser.lower())
print(oldusers)
print(newusers)
for newuser in newusers :
if newuser.lower() in oldusers :
print(f"抱歉,用户名{newuser}已被占用,请尝试使用其他用户名。\n")
else:
print(f"用户名{newuser}可用,请继续填写其他信息,完成注册。")
users.append(newuser.lower())
print(f"\t新用户名{newuser}已加入用户列表中。\n")
print(users)
习题 5.11 输出1st到9th的序数列表
for number in range(1,10) :
if number == 1 :
print(f"{number}st")#数字为1时,后缀为st
elif number == 2 :
print(f"{number}nd")#数字为2时,后缀为nd
else:
print(f"{number}th")#数字为3-9时,后缀为th