《Python编程从入门到实践》学习笔记<5>:IF语句

  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("
Finished 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(" Finished 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:Pythonpython.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
原文地址:https://www.cnblogs.com/a404790696/p/10950985.html