if语句
编程时经常需要检查一系列条件,并据此决定采取什么措施,在python中,if语句让你能够检查程序的当前状态,并据此采取相应的措施,接下来将学习一下条件测试,以检查感兴趣的任何条件,学习简单的if语句,以及创建一系列复杂的if语句来确定当前到底处于什么情形,把学到的应用于列表,以编写for循环,以一种方式处理列表中的大多数元素,并以另一种不同的方式处理包含特定值得元素。
1.一个简单的示例
下面是一个简单的示例,演示了如何使用if语句来正确地处理特殊情形,假设你有一个汽车列表,并想将其中每辆汽车的名称都打印出来,对于大多数汽车,都应以首字母大写的方式打印出来,但对于汽车名为‘bmw’,应以全大写的方式打印出来,下面的代码遍历一个列表,并以首字母大写的方式打印其中的汽车名,但对于汽车名为‘bmw’,以全大写的方式打印:
cars=['audi','bwm','subaru','toyota']
for car in cars:
if car=='bwm'
print(car.upper())
else:
print(car.title())
打印结果如下:
Audi
BMW
Subaru
Toyota
上述示例涵盖了本次将介绍的很多概念,下面先来介绍可用来在程序中检查条件的测试。
2. 条件测试
每条if语句的核心都是一个值为True或False的表达式,这种表达式被称为条件测试,python根据条件测试的值为True还是False来决定是否执行if语句中的代码,如果条件测试的值为True,python将执行紧跟在if语句后面的代码,如果为False,python就会忽略这些代码。
检查是否相等
大多数条件测试都将一个变量的当前值同特定值进行比较,最简单的条件测试检查变量的值是否与特定的值相等:
car='bmw'
print(car=='bmw')
打印结果如下:
Ture
上述例子中,我们首先使用=将car的值设置为bmw,接下来,使用两个==检查car的值是否为bmw,这个相等运算符在它两边的值相等时返回True,否则返回False,上述例子测试,说明两边的值都相等,因此返回Ture.
如果car的值不等于bmw,上述测试将返回False:
car='audi'
print(car=='bmw')
打印结果如下:
False
一个等号是陈述,对于上述例子中,=我们可以理解为将变量car的值设置为audi,两个==是发问,可理解为,变量car的值是bmw吗?是则返回Ture,否则返回False。
检查是否相等时不考虑大小写
在python中检查是否相等时区分大小写,例如,两个大小写不同的值会被视为不相等:
car='Audi'
print(car=='audi')
打印结果如下:
False
如果大小写很重要,这种行为有其优点,但如果大小写无关紧要,而只想检查变量的值,可将变量的值转换为小写,再进行比较:
car='Audi'
print(car.lower()=='audi')
打印结果如下:
True
上述例子中说明,无论值Audi的大小写如何,上述测试都将返回True,因为该测试不区分大小写,函数lower()不会修改存储在变量car中的值,因此进行这样的比较时不会影响原来的变量:
car='Audi'
print(car.lower()=='audi')
print(car)
打印结果如下:
True
'Audi'
上述示例中,我们首先将首字母大写的Audi存储在变量car中,然后我们获取变量car的值时将其转换为小写,然后我们将结果与字符串小写的audi进行比较,因此返回的结果为True,最近我们再次打印car的值,得出Audi,说明这个条件测试并不会影响存储在变量car中的值。
网站采用类似的方式让用户输入的数据符合特定的格式,例如,网站可能使用类似的测试来确保用户名是独一无二的,而并非只是与另外一个用户名的大小写不同,用户提交新的用户名时,将它转换为小写,然后与既有用户名的小写版本进行比较,执行这种检查时,如果有用户名join,不管大小写,再次提交一个JOIn时都将遭到拒绝。
检查是否不相等
要判断两个值是否不等,可结合使用惊叹号和等号(!=),其中的惊叹号表示不,在很多程序中也是如此。
下面再使用一条if语句来演示如何使用不等运算符,我们将把要求的某菜系配料存储在一个变量中,再打印一条消息,指出顾客要求的配料是否是小银鱼:
ingredients='薯条'
if ingredients !='小银鱼':
print('顾客要求的配料不是小银鱼')
打印结果:
顾客要求的配料不是小银鱼
你编写大多数的条件表达式都检查两个值是否相等,但有时候检查两个值是否不等的效率更高。
比较数字
检查数值非常简单,例如,下面的代码检查一个人是否满18岁:
age=18
print(age==18)
打印结果如下:
True
你还可以检查两个数字是否不等,例如,下面的代码在提供的答案不正确时打印一条消息:
answer=17
if answer !=40:
print('判断结果是对的')
打印结果如下:
判断结果是对的
上述判断中,answer是不等于42的,所以条件满足,则缩进的代码得到执行。
条件语句中可包含各种数学比较,如大于,小于,大于等于,小于等于:
age=18
print(age=18)
print(age>18)
print(age
print(age>=18)
print(age
打印结果如下:
True
False
False
True
True
在if语句中可使用各种数学比较,这让你能够直接检查关心的条件。
检查多个条件
你可能同时检查多个条件,例如,有时候你需要在两个条件都为True时才执行相应的操作,而有时候你只需要求一个条件为True时就执行相应的操作,在这些情况下,关键字and和or可助你一臂之力。
使用and检查多个条件
要检查是否两个条件都为True,可使用关键字and将两个条件测试合而为一,如果每个测试都通过了,整个表达式就为True,如果只是有一个测试没有通过,整个表达式就为False.
例如,要检查是否两个人都不小于21岁,可使用下面的测试:
age_0=22
age_1=18
print(age_0>=21 and age_1>=21)
打印结果如下:
False
上述测试中,我们检查两个变量的值是否都大于21,显然,左边通过测试了,而右边没有通过测试,所以返回结果为False。
age_0=22
age_1=22
print(age_0>=21 and age_1>=21)
打印结果如下:
True
上述测试中,我们检查两个变量的值是否都大于21,显然,都通过了测试,所以返回结果为True。
使用or检查多个条件
关键字or也能够让你检查多个条件,但只要至少有一个条件满足,就能通过整个测试,仅当两个都没有通过测试时,才返回False。
下面再次检查两个人的年龄,但检查的条件是至少有一个人的年龄不小于21岁:
age_0=22
age_1=18
print(age_0>=21 or age_1>=21)
打印结果如下:
True
上述中描述了,使用or,只要满足一个条件都返回为True。
age_0=22
age_1=22
print(age_0>=23 or age_1>=23)
打印结果如下:
False
只有两个都不满足条件才返回False。
检查特定值是否包含在列表中:
request=['mush','onions','pine']
print('mush' in request)
打印结果如下:
True
上述例子中体现了,关键字in让python检查列表reques是否包含mush,返回的结果为True,说明包含。
request=['mush','onions','pine']
print('hello' in request)
打印结果如下:
False
上述例子中体现了,关键字in让python检查列表reques是否包含hello,返回的结果为False,说明不包含。
检查特定值是否不包含在列表中:
有些时候,确定特定值未包含在列表中很重要,在这种情况下,可使用关键字not in。例如,如果有一个列表,其中包含了被禁止在论坛上发表评论的用户,就可在允许用户提交评论钱,检查他是否被禁言:
users=['andrew','caro','david']
user='marie'
if user not in users:
print(user+',该名字没有在被禁言的名单中')
打印结果如下:
marie,该名字没有在被禁言的名单中
布尔表达式
随着你对编程的了解越来越深入,将遇到术语布尔表达式,它不过是条件测试的别名,与条件表达式一样,布尔表达式的结果要么是Ture,要么是False。
布尔值通常用于记录条件,如游戏是否运行正常,或用户是否可以编辑网站的特定内容:
game_active=True
can_edit=False
在跟踪程序状态或程序中重要的条件方面,布尔值提供了一种高效的方式。
3.if语句
理解条件测试后,就可以开始编写if语句了, if语句有很多种,选择使用哪种取决于要测试的条件数,前面讨论条件测试时,列举了多个if语句示例,下面更深入地讨论这个主题。
简单的if语句
最简单的if语句只有一个测试和一个操作:
if conditonal_test:
do something
在第一行中,可包含任何测试条件,而在紧跟在测试后面的缩进代码块中,可执行任何操作。
如果条件测试的结果为True,python就会执行紧跟在if语句后面的代码,否则python将忽略这些代码。
假设有一个表示某人年龄的变量,而你想知道这个人是否够投票的年龄,可使用如下代码:
age=19
if age>=18:
print('满足投票年龄')
打印结果如下:
满足投票年龄
在上述中,python检查变量age的值是否打印或等于18,答案是肯定的,因此python执行缩进的print语句,否则将忽略。
在紧跟if语句后面的代码行中,可根据需要包含任意数量的代码行,下面再一个人够投票的年龄时在打印一行输出,问他是否登记了:
age=19
if age>=18:
print('满足投票年龄')
print('请问你是否登记过')
打印结果如下:
满足投票年龄
请问你是否登记过
上述例子中,条件都测试通过了,而两条print语句都缩进了,因此他们都将执行,如果age这个值小于18,这个程序将不会有任何输出。
if-else语句
经常需要在条件测试通过了时执行一个操作,并在没有通过时执行另一个操作,在这种情况下,可使用python提供的if-else语句,if-else语句块类似于简单的if语句,但其中的else语句让你能够指定条件测试未通过时要执行的操作。
下面的代码在一个人够投票的年龄时显示与前面的相同的消息,同时在这个人不够投票的年龄也显示一条消息:
age=17
if age>=18:
print('满足投票年龄')
print('请问你是否登记过')
else:
print('对不起,你不满足投票的年龄')
print('只有满18岁以上的才能参与投票')
打印结果如下:
对不起,你不满足投票的年龄
只有18岁以上的才能参与投票
如果条件测试通过了,就执行第一个缩进的代码,如果测试结果没有通过就执行第二个缩进的代码,上述中,修改了age=17,明显不大于18,所以测试未通过,所以执行第二个缩进的代码。
if-elif-else结构
经常需要检查超过两个的情形,为此,可使用python提供的if-elif-else结构,python只执行if-elif-else结构中的一个代码块,它依次检查每个条件测试,直到遇到通过了的条件测试,测试通过后,python将执行紧跟在它后面的代码,并跳过余下的测试。
在现实世界中,很多情况下需要考虑的情形都超过两个,例如,来看一个根据年龄段收费的游乐场:
要求:
4岁以下的儿童免费;
4~18岁收费5元;
18岁(含)以上收费10元;
下面的代码确定一个人所属的年龄段,并打印一条包含门票价格的消息:
age=12
print('你可以免费入场')
elif age
print('你需要支付5元的门票价格')
else:
print('你需要支付10元的门票价格')
打印结果如下:
你需要支付5元的门票价格
上述例子中,首先测试了这个人是否小于4岁,如果小于4岁将执行第一个缩进代码,显然不对,则忽略第一个缩进代码,然后进入下一行测试,测试这个人是否小于18岁,显然,这个人小于18岁,所以直接打印第二个缩进代码块,并忽略后面的else代码块,如果上面上来测试都不满足条件,python才会执行else代码块中的代码。
为了让代码更加简洁,可不在if-elif-else代码块中打印门票价格,而只在其中设置门票价格,并在它后面添加一条简单的print语句:
age=12
price=0
elif age
price=5
else:
price=10
print('你需要支付门票:'+str(price)+'元。')
打印结果如下:
你需要支付门票:5元。
上述例子中,根据人的年龄设置变量price的值,在if-elif-else结构中设置prince的值后,一条没有缩进的代码print语句会根据这个变量的值打印一条消息,指出门票的价格。
这个示例输出的结果与前一个示例相同,但if-elif-else结构的作用更小,它只确定门票的价格,而不是在确定门票价格的同时打印一条消息,除效率高外,这些修订后的代码还更容易修改,要调整输出消息内容,只需要修改一条而不是三条print语句。
使用多个elif代码块
可根据需要使用任意数量的elif代码块,例如,假设前述游乐场要给老年人打折,可再添加一个条件测试,判断顾客是否符合打折条件,下面假设对于65岁(含)以上的老人,可以半价(即5元门票)购买门票:
age=80
price=0
elif age
price=5
elif age
price=10
else:
price=5
print('你需要支付门票:'+str(price)+'元。')
打印结果如下:
你需要支付门票:5元。
上述示例表明,elif可以根据需要不断增加的,修改了变量值为88,python进行逐条测试,到新增的是否小于65进行判断,显然还是不满足,所以还是执行else的代码块。
省略else代码块
python并不需要if-elif结构后面必须跟else代码块,在有些情况下,else代码块很有用,而在其它一些情况下,使用一条elif语句来处理特定的情形更清晰:
age=80
price=0
elif age
price=5
elif age
price=10
elif age>=65:
price=5
print('你需要支付门票:'+str(price)+'元。')
打印结果如下:
你需要支付门票:5元。
通过上述的例子可以看出,缺少else代码块也可以正常运行,根据条件一条条进行测试,直到最后一个age>=65,测试通过,则执行下面缩进的语句块。
else是一条包罗万象的语句,只要不满足任何if和else中的条件测试,其中的代码就会执行,这可能会引入无效甚至恶意的数据,如果知道最终要测试的条件,应考虑使用一个elif代码来代替else代码块,这样,你就可以肯定,仅当满足相应的条件时,你的代码才会执行。
测试多个条件
if-elif-else机构功能强大,但仅适合用于只有一个条件满足的情况,遇到通过了的测试后,python就会跳过下面的测试,这种行为很好,效率很高,让你能够测试一个特定的条件。
然而,有时候必须检查你关心的所有条件,在这种情况下,应使用一系列不包含elif和else代码块的简单if语句 ,在可能有多个条件为True,且你需要在每个条件为True时都采取相应措施,适合使用这种方法。
下面来看披萨店示例,如果顾客点了两种配料,就需要确保在其披萨中包含这些配料:
request=['火腿',辣椒']
if '火腿' in request:
print('顾客添加了火腿')
if '薯条' in request:
print('顾客添加了薯条')
if '辣椒' in request:
print('顾客添加了辣椒')
print('这是顾客要的披萨')
打印结果:
顾客添加了火腿
顾客添加了辣椒
这是顾客要的披萨
上述例子中,我们首先创建了一个列表,其中包含顾客点的配料,下面第一个if语句检查顾客是否点了配料火腿,如果点了,就打印一条确认信息,第二个if语句检查顾客是否点了配料薯条,如果点了也打印一条确认信息,第三条if语句检查顾客是否点了辣椒,如果点了也打印一条确认信息。
结果表明,执行第一个if语句的时候,确认了顾客是点了火腿的,所以打印了一条确认信息,然后继续执行下一条if语句,显然顾客没有点薯条,所以没有打印确认信息,然后再往下执行第三条if语句,顾客是点了辣椒的,所以也打印了第三条确认信息,最后执行缩进外的代码块,print。
如果上述例子换成if-elif-else就不会正常运行,因为有一个测试通过后,就会跳过余下的测试。
4.使用if语句处理列表
通过结合使用if语句和列表,可完成一些有趣的任务,对列表中特定的值做特殊处理,高效地管理不断变化的情形,如餐馆是否还有特定的食材,证明代码在各种情形下都将按预期那样运行。
检查特殊元素
继续使用前面披萨店的示例,这家披萨店制作披萨时,每添加一种配料都打印一条消息,通过创建一个列表,在其中包含顾客点的配料,并使用一个循环来指出添加到披萨中的配料,可以以极高的效率编写这样的代码:
request=['火腿','薯条','辣椒']
for requests in request:
print('顾客添加了:'+requests+'.')
print('以上就是顾客需要的披萨配料')
打印结果如下:
顾客添加了:火腿.
顾客添加了:薯条.
顾客添加了:辣椒.
以上就是顾客需要的披萨配料
如果,披萨店的薯条用完了,该如何处理了,为妥善地处理这种情况,可在for循环中包含一天if语句:
request=['火腿','薯条','辣椒']
for requests in request:
if requsets=='薯条':
print('对不起,没有该配料了')
else
print('顾客添加了:'+requests+'.')
print('以上就是顾客需要的披萨配料')
打印结果如下:
顾客添加了:火腿.
对不起,没有该配料了
顾客添加了:辣椒.
以上就是顾客需要的披萨配料
上述示例中,if语句会进行检查顾客是否点了薯条,如果有点,则打印一条消息,提示该配料没有了,else代码块确保顾客点的其它配料都要加到披萨中。
确定列表不是空的
以上的示例中,列表都做了简单的假设,至少都包含了一个元素,我们马上就要让用户来提供存储在列表中的信息,因此列表不能再假设循环运行时列表是空的,鉴于此,在运行for循环确定列表是否为空很重要。
下面再制作披萨前检查顾客点的配料列表是否为空,如果列表为空,就像顾客确认他是否要点普通披萨,如果列表不为空,就像前面那样制作披萨:
request=[]
if request:
for requests in request:
print('顾客添加了:'+requests+'.')
print('以上就是顾客需要的披萨配料')
else:
print('你确定要点普通的披萨吗?')
打印结果如下:
你确定要点普通的披萨吗?
上述示例中,我们首先创建了一个空的列表,然后先用if语句进行简单的检查,而不是直接用for循环,在if语句中将列表名用在表达式中时,python将在列表至少包含一种元素时返回True,并在为空是返回False,如果列表不为空,就运行和上一个示例相同的for循环,否则就打印一条消息,询问顾客是否确定要点普通的披萨。
使用多个列表
顾客的要求往往五花八门,披萨配料尤其如此,如果顾客要在配料中添加果汁,我们怎么判断,可使用列表和if语句来确定能否满足顾客的要求。
来看看在制作披萨前如何拒绝顾客怪异的要求,下面的示例定义了两个列表,其中第一个为披萨店供应的配料,第二个为顾客点的配料,这次对于request中的每个元素,都检查他是否是披萨店供应的配料,在决定是否在披萨中添加他:
available_request=['火腿','薯条','辣椒']
user_request=['火腿','果汁','辣椒']
for uesr_requests in uesr_request:
if uesr_requests in available_request:
print('顾客添加了,'+uesr_requests+'。')
else:
print('对不起,没有你点的配料:'+uesr_requests+'。')
print('以上就是你的披萨配料')
打印结果如下:
顾客添加了,火腿。
对不起,没有你点的配料:果汁。
顾客添加了,辣椒。
上述示例中,我们定义了一个列表,其中为披萨店提供的配料,请注意,披萨店的配料是固定的,也可以使用元组来存储他们,然后我们在创建了一个列表,其中包含顾客点的配料,请注意那个果汁,再然后,我们遍历顾客点的配料列表,在这个循环中,对于顾客点的每种配料,我们都检查它是否包含在供应的配料列表中,如果是,就将其加入到披萨中,否则,将运行else代码块,告诉顾客,没有该配料。
小结
通过上面的了解,学习了如何编写结果要么为True要么为False的条件测试,如何编写简单的if语句,if-else语句和if-elif-else结构,在程序中,使用这些结构来测试特定的条件,以确定这些条件是否满足,还有了解了如何在利用高效的for循环的同时,以不同于其它元素的方式对特定的列表元素进行处理。
领取专属 10元无门槛券
私享最新 技术干货