if语句作为条检测用的判断语句,在很多编程语言中经常使用,python也不例外。if语句的核心是True和False的表达式,也即是条件测试。当条件的结果为True时,程序会自动执行IF后面的语句;当条件为False时,则执行else或elif后面的语句,如果没有则忽略。
大多数情况下,条件测试都是将一个变量的值拿来同另一个变量进行对比,从而判断需要执行的代码,如下例所示:
if 1 ==2: print("yes") else: print("no")
这是最简单的if语句应用,逻辑其实很简单,如果1=2,就返回yes,否则就返回no,程序跑出来的结果自然是no。这就是if语句最直接的运用方式,判断!
当然,日常的开发过程中,对于if语句的运用自然不可能这么简单,正如同书中所举的关于买票的例子,如下所示:
age = 12 if age < 18: price = 5 else : price = 10 print("You admission cost is $" + str(price) + ".")
首先设定一个变量age,给他赋值12。然后开始进入程序,当age小于18岁时,票价为5美刀;当age大于18岁时,票价为10美刀,结果如下所示:
You admission cost is $5.
但是在日常生活中,我们知道,景区的票价往往不止有成人票和未成年票,还有儿童票。但是"if……else……"的判断只有两个结果,如果再添加一个或者更多的话,有必要再写一段"if……else……"循环么?当然没必要!这时候,可以使用"if……elif……else……"循环来解决这个问题,如下所示:
age = 12 if age < 4: price = 0 elif age < 18: price = 5 else : price = 10 print("You admission cost is $" + str(price) + ".")
同样的例子,在elif的作用,程序多了一个选择!还是设定变量age为12岁,当age小于四岁的时候免票,当age小于18岁的时候,收取5美刀票价;当age是其他数字的时候,收取10美刀票价!这样的例子对于一个有编程经验的人来说,很容易就能理解!但是对于完全没接触过编程的人来说,有一个很重要的概念!那就是程序是如何判断"age < 4"之后的逻辑的。
事实上有这样的想法并不奇怪,简单来说,当程序开始执行“age < 4”判断的时候,就已经将符合条件的数据进行了处理,而执行“age < 18”判断的时候,则是不满足"age < 4"的数据。正如同开篇所说if语句的概念一样,程序每执行一步,都会讲满足该步骤条件的数据进行处理,将不满足该步骤条件的数据交给下一步骤,直到数据处理完成,或再也无法处理,导致判断结束为止。因此当小程序开始判断"age < 18"的时候,满足"age < 4"的部分数据已经处理完毕,在存储空间内被剔除了。同样在执行“else”步骤的时候,满足"age < 4"和"age < 18"的数据也已经被处理完毕后剔除出去了,所以“else”执行的只是前两个步骤执行完后,因为没处理掉而剩下的这部分数据。因此从整体上来看,整个if语句就是在执行这样的线性处理流程!
上面这段代码执行结束后的答案,仍然跟之前的票价问题代码的答案相同。那么如果票价再细分,出现四个不同的分支,比如增加老年票价,应该怎么办呢?答案很简单,再加一个“elif”就行了!如下所示:
age = 66 if age < 4: price = 0 elif age < 18: price = 5 elif age < 60: price = 10 else : price = 8 print("You admission cost is $" + str(price) + ".")
此时程序中有新增了一个"elif"分支,当age大于60岁时,票价为8美刀。我们将age赋值为66岁,执行程序可以看到如下结果:
You admission cost is $8.
从上例中可以看出,当判断分支变多了以后,可以通过增加“elif”分支的方法,增加判断的选项,以此来满足需求。对于"elif"的数量,Python中并没有限制,因此多个"elif"是可以的。
对于多分支的判断问题,可以用"elif"来解决,那么对于多参与的判断问题呢?如果引入列表参与的if语句,又是什么样的情况的?
假设现在通过团购进行买票,多人同时购买,如上例一样,通过对单一年龄的判断来决定票价的方法,并不适用于人数众多的情况。此时可以通过引入列表的方式来进行解决,如下所示:
ages = [3,11,25,7,22,15,65,18,17] for age in ages: if age <= 4: price = 0 print("You admission cost is $" + str(price) + ".") elif age < 18: price = 5 print("You admission cost is $" + str(price) + ".") elif (age >= 18) and (age < 60): price = 10 print("You admission cost is $" + str(price) + ".") else : price = 8 print("You admission cost is $" + str(price) + ".")
上例可以看出,当一个旅行团集体参加旅游的情况下,我们创建了一个列表ages,将团员们的年龄输入进去,分别为[3,11,25,7,22,15,65,18,17]。前文关于列表的操作中曾说道通过for循环来遍历列表的方法,因此创建变量age来循环遍历列表ages。age将ages中的值分别取出,在if语句中进行判断,运行结果如下:
You admission cost is $0. You admission cost is $5. You admission cost is $10. You admission cost is $5. You admission cost is $10. You admission cost is $5. You admission cost is $8. You admission cost is $10. You admission cost is $5.
对于列表的循环判断问题,还有一种列表对应列表的情况!如书中披萨制作的案例:当顾客点的披萨食材和饭店有的披萨食材不同的现象!如下例所示:
available_toppings = ['mushrooms','olives','green peppers','pepperoni','pineapple','extra cheese'] requested_toppings = ['mushrooms','french fries','extra cheese'] for requested_topping in requested_toppings: if requested_topping in available_toppings: print("Adding " + requested_topping + ".") else: print("Sorry,we don`t have " + requested_topping + ".") print("\nFinished making your pizza!")
此时可以看到,available_toppings包含的食材为['mushrooms','olives','green peppers','pepperoni','pineapple','extra cheese'],而顾客点的食材为['mushrooms','french fries','extra cheese'],其中'french fries'是饭店食材中没有的!因此首先打开for循环,定义变量requested_topping用来循环顾客所需的食材清单requested_toppings,然后在下面将循环的每一项结果,都与饭店菜单available_toppings中的食材进行比较,满足条件的情况下,执行if后面的语句,输出print("Adding " + requested_topping + "."),不满足条件的情况下执行else后面的语句,输出print("Sorry,we don`t have " + requested_topping + "."),最后输出print("\nFinished making your pizza!"),执行结果如下所示:
Adding mushrooms.
Sorry,we don`t have french fries.
Adding extra cheese.
Finished making your pizza!
对于列表循环的if判断,有一个很常用的概念需要知道,就是空列表的判断问题!如下所示:
a = [] if a : print('y') else: print('n')
如上例所述,定义一个空列表a,当列表不为空的时候,返回“y“,否则返回”n“,运行结果如下所示:
D:\Python\python.exe E:/python/test1/venv/test1.py
n
进程完成,退出码 0
此时可以看到程序的运行结果为“n”,也即是说判断列表为空的时候,可以直接在if后写上列表,而不需要给出条件,系统会自动判断列表是否为空的情况,当列表不为空则符合判断结果为True的情况,系统自动执行if后面的判断语句,返回值为”y“;当列表为空的时候,执行”else“,返回”n“。基于这个概念,来看一看习题5-10中的例子:
#5-10 检查用户名: #按下面的说明编写一个程序,模拟网站确保每位用户的用户名 都独一无二的方式。 #创建一个至少包含5个用户名的列表,并将其命名为current_users。 #再创建一个包含5个用户名的列表,将其命名为new_users,并确保其中有一两个用户名也包含在列表current_users 中。 #遍历列表new_users,对于其中的每个用户名,都检查它是否已被使用。 #如果是这样,就打印一条消息,指出需要输入别的用户名;否则打印一条消息,指出这个用户名未被使用。 current_users = ['John','Lisa','MARK','linda','HeLen'] new_users = ['John','Lisa','bob','tom','pol'] for new_user in new_users: use = False for current_user in current_users: if new_user.lower() == current_user.lower(): use = True if use: print(new_user.title() + " has been used.") else: print('You can use the name ' + new_user.title())
在上例中可以看到,按照要求定义两个列表current_users和new_users用来存放姓名,先定义变量new_user用来遍历列表new_users,每次遍历列表new_users中的元素时,都为变量use 赋值False,接着进入内层循环。定义变量current_user来循环遍历列表current_users。当变量new_user的值等于变量current_user的值时,将变量use的值修改为True,此时内层循环结束,进入外层循环的判断中!当user的值为True时,执行if后面的代码,反之执行else后面的代码!还记得上文中对空列表的判断和开头对if语句的定义么?if语句的核心都是一个值为True或False的表达式,区别在于你可以在if后面写上表达式,也可以跳过表达式,直接引用True或False的值本身!其执行结果,如下所示:
John has been used.
Lisa has been used.
You can use the name Bob
You can use the name Tom
You can use the name Pol
相对而言,例11反而侧重于if语句本身的应用,而非概念,如下所示:
#序数表示位置,如1st和2nd。大多数序数都以th结尾,只有1、2和3例外。 #在一个列表中存储数字1~9。 #遍历这个列表。 #在循环中使用一个if-elif-else 结构,以打印每个数字对应的序数。 #输出内容应为1st 、2nd 、3rd 、4th 、5th 、6th 、7th 、8th 和9th ,但每个序数都独占一行 numbers = [1,2,3,4,5,6,7,8,9] for number in numbers : if number == 1: print(str(number) + 'st') elif number == 2: print(str(number) + 'nd') elif number == 3: print(str(number) + 'td') else: print(str(number) + 'th')
程序输出结果如下所示:
1st
2nd
3td
4th
5th
6th
7th
8th
9th