通过结合使用if语句和列表,可完成一些有趣的任务:对列表中特定的值做特殊处理;高效地管理不断变化的情形,如餐馆是否还有特定的食材;证明代码在各种情形下都将按预期那样运行。
大大的图
我的图
1.检查特殊元素
比萨店在制作比萨时,每添加一种配料都打印一条消息。通过创建一个列表,在其中包含顾客点的配料,并使用一个循环来指出添加到比萨中的配料,可以以极高的效率来编写这样的代码。然而,如果比萨店的青椒用完了,为妥善处理这种情况,可在for循环中包含一条if语句,如果顾客点的是青椒,就指出不能点青椒的原因,剩下的配料按照原方式处理。
对应大大的代码,我把第九行的if语句稍作改动,变成了无材料不添加。对应写了一else语句,这样顾客就可以知道在他点的配料里有哪些是可以添加的,有哪些是无法添加的
2.确定列表不是空的
到目前为止,对于处理的每一个列表都做了一个简单假设,即假设它们都至少包含一个元素,我们马上就要让用户来提供存储在列表中的信息,因此不能再假设循环运行时列表不是空的。有鉴于此,在运行for循环前确定列表是否为空很重要。
在制作比萨前先检查顾客点的配料列表是否为空。如果列表是空的,就向顾客确认他是否要点普通比萨;如果列表不为空,就像前面的示例那样制作比萨。
在这里,我们首先创建了一个空列表,其中不包含任何配料,在循环运行前我们检查顾客点的配料列表是否为空。
在if语句中将列表名用在条件表达式中时,Python将在列表至少包含一个元素时返回True,并在列表为空时返回False。
当顾客点的配料列表为空时,if语句返回False,跳过了循环直接执行与if相对应的else语句(12行),打印出Are you sure you want a plain pizza?
3.使用多个列表
顾客的要求往往五花八门,在比萨配料方面尤其如此。因此我们可以使用两个列表和if语句在满足顾客要求的同时拒绝怪异要求。在大大的代码中定义了两个列表,其中第一个列表requested_toppings是顾客点的配料,第二个列表available_toppings是比萨店供应的配料。对于顾客点的每个配料,都检查它是否是披萨店供应的配料,再决定是否在比萨中添加它。
请注意,如果比萨店供应的配料是固定的,也可使用一个元组来存储它们。
4.设置if语句的格式
在条件测试的格式设置方面,PEP 8提供的唯一建议是,在诸如==、 >=和<= 等比较运算符两边各添加一个空格,例如,if age < 4:要比if age<4:好。
这样的空格不会影响Python对代码的解读,而只是让代码阅读起来更容易。
5.小结
本章内容为if语句,通if语句可以对列表中不同元素执行不同的处理。
每条if语句的核心都是一个值为True或False的表达式,这种表达式被称为条件测试。Python根据条件测试的值为True还是False来决定是否执行if语句中的代码。如果条件测试的值为True,Python就执行紧跟在if语句后面的代码;如果为False,Python就忽略这些代码,转而执行elif或else后面的代码,如果这个if语句没有配套的elif或else语句,Python不执行代码。
本章中要熟练掌握if-elif-else语句,但不是所有情况都可以这么写。
(1)Python并不要求if-elif结构后面必须有else代码块。在有些情况下,else代码块很有用;而在其他一些情况下,使用一条elif语句来处理特定情形更清晰。else是一条包罗万象的语句,只要不满足任何if或elif中的条件测试,其中的代码就会执行,这可能会引入无效甚至恶意的数据。如果知道最终要测试的条件,应考虑使用一个elif代码块来代替else代码块。这样,你就可以肯定,仅当满足相应的条件时,你的代码才会执行。
(2)if-elif-else语句仅适用于只有一个条件满足的情况,遇到通过了的测试后,Python就跳过余下测试,如果需要检查你所关心的所有条件,应使用一系列不包含elif和else代码块的简单if语句。在可能有多个条件为True,且你需要在每个条件为True时都采取相应措施时,适合使用这种方法。
使用if语句还可以检查特殊元素,确定列表非空,在多个列表中建立元素之间的联系。
if语句就像循环语句一样非常常见,且其后的缩进写法也同for循环一致。学会了if和for我们已经可以写出很多简单程序了。