6: 如果

直到现在,我们所学的所有程序都是一行一行地执行代码。中间不跳过任何一行。下面是一个例子:通过键盘方向键或滚动轴来查看每行代码。

这节课我们要学一个新内容,条件从句。条件从句指在一定条件被满足的情况下,某些程序运行,而在不被满足的情况下,某些程序不运行。比如说,我们将以下程序做更改:当一个人的年龄足够大时,输出一个额外的信息。那么我们需要加两行:if age > 65: (意思是"如果年龄大于65岁") 和  print('Enjoy retirement!')。现在我们来再次按行运行一下程序:

这里要注意,print语句被跳过了因为age只有31! 那么把出生年份改为1928,同样的程序再次运行 又会是什么结果呢?

注意到区别了么?后一个程序(age85的)打印出了两行,没有跳过任何一行。这就是if statement的目的:先检查一些条件(age大于65么?),只有当这些条件成立时再运行某些程序 (打印Enjoy retirement!)。

我们把被检查的条件叫做condition,把如果条件成立则运行的程序叫做body。Body需要被缩进,也就是说,在这一行的开头需要有一些额外的空格(参考以上代码)。Body可以包含不止一个语句:多写几行缩进的程序即可达到此目的。下面是一个例子。

  • 控制台或观察仪中运行此程序,其中出生年份为1982年。两个缩进的行都被跳过了。

在下一个练习中,你需要写一个有关布尔比较的程序。在上面的那个例子中我们已经看到了"if x > y:"意味着"如果x大于y"。下面的程序可能会有帮助:

  • if x < y:表示"如果x小于y"
  • if x >= y:表示"如果x大于等于y"
  • if x <= y:表示"如果x小于等于y"

编程练习: IHOPython
写一个程序:通过pancakes = int(input())输入一个整数。如果pancakes大于3,打印Yum!;如果pancakes小于等于3,打印Still hungry!提示

条件语句的格式

  • 第一行,
    if «condition»:
    有三个部分:if«condition»必须是一个是否判断(下面会有详细介绍),以及冒号:
  • 然后就是由一行或多行缩进组成的body。空格多少(缩进的多少)不重要, 但是缩进如果不一致就会出现问题因为Python会根据缩进的多少来判断哪里是body开始,哪里结束。

条件语句的body部分就属于编程“block”。在之后的学习中,我们会经常看到Blocks,比如"for loops"以及编写自己的程序。(某些其他的计算机语言在block两边加上大括号{}.)

下一个练习其实是合四个练习为一。通过改变程序中各行的顺序可以得到不同的结果。点击每一行来打开;点开的顺序随意。和以前一样,拖拽每一行来改变顺序。


第1部分:未料到的缩进
综合练习: 未料到的缩进
下列错误会出现:

IndentationError: unexpected indent
  • if 1000 < 10:
  • print("message 1")
  • print("message 2")
  • if 2 > 1:
  • print("message 3")
第2部分: 未料到的未缩进
综合练习: 未缩进
下列错误会出现:

IndentationError: unindent does not match any outer indentation level
  • if 1000 < 10:
  • print("message 2")
  • if 2 > 1:
  • print("message 3")
  • print("message 1")
第3部分:应缩进而未缩进
综合练习: 应缩进
下列错误会出现:

IndentationError: expected an indented block
  • if 1000 < 10:
  • print("message 1")
  • print("message 2")
  • if 2 > 1:
  • print("message 3")
第4部分:正确的缩进
综合练习: 正确的缩进
不会有错误!
  • if 1000 < 10:
  • print("message 1")
  • print("message 2")
  • if 2 > 1:
  • print("message 3")

对,错以及布尔

到目前为止,在if语句里面的«condition»部分,我们见到了很简单的数字大小的比较x > y,当x大于y时这个命题是正确的,当x小于等于y时这个命题是错误的。更通常化一些,任何的对/错值都叫做Boolean (see George Boole)。在Python中,bool表示Boolean values;只有两个bool值,TrueFalse

示例
Boolean表达式

在Python中,在直接使用boolTrueFalse时需要大写第一个字母,否则就会出错。

Boolean比较

运算符>, <, <=, 和 >=比较两个数字,返还一个布尔值。还有两个方式来比较数字:

  • x == y等式运算符, 如果xy相等,就返还True
  • x != y不等运算符, 如果xy不相等,返还True
  • ==!=也适用于字符串等其他类型数据

(两个等号==是因为一个等号x = «expression»已经有"将变量x赋予«expression»值的意义了。将===弄混是一个常见的错误来源.)

下面是一个练习,我们会接触到一种新的比较方式。

编程练习: 你的标记是什么?
编写一个程序:输入一个整数,根据数是是正的,负的,还是0,输出Positive, Negative, or Zero其中的一个。
你可以在下面的框中输入程序的输入。

我们刚刚介绍了 block 的概念 (几行代码聚在一起,缩进同 样的程度)。你可以在 block 里面嵌套另一个 block:

if password=='openSesame':
  print('User logged on.')
  if hour>17:
    print('Good evening!')
  print('Enter a command:')
在这里,外面的block由四行代码组成,里面的block由1行代码组成:
if password=='openSesame':  
print('User logged on.')
if hour>17:
print('Good evening!')
print('Enter a command:')

选择题练习: 嵌套条件语句
下列哪一个可能是输出值?
正确! 如果由信息展示出来,一定是外围的(蓝色的)block被运行,换句话说,密码正确。在这个例子中,尽管hour>17是错的(内部的block被跳过了),外围的block中print('Enter a command:')一行仍会被运行。

现在,你需要用嵌套的blocks来写一个比较复杂的计算年龄的程序。

编程练习: Age checker
编写程序:输入一个整数(代表某个人的年龄)。如果该值大于等于18,则打印You can vote。如果年龄在0到17岁之间,则打印 Too young to vote。如果年龄小于0,则打印You are a time traveller.

在之后的第9课里,通过使用tt>else

elif(或者如果)指令,和Boolean运算符"and", "or"和"not",我们会看到设计多个boolean语句的程序可以被简化的情况。现在你可以进行下一课的学习了。