Program Arcade Games
With Python And Pygame

Chapter 3: 问答游戏和if语句

我们如何能够知道玩家击败了最高的分数? 我们如何知道玩家角色的生命还剩几条? 我们又如何知道她是否有打开被锁上的门的钥匙?

Video: Introduction to the if statement

我们需要的if语句。if语句也常被称作条件语句。(你可以通过使用“条件语句”这个短语 来告诉大家你有多聪明。) if语句允许计算机作出一个决定。外面是不是很热?太空飞船是不是已经碰到了屏幕边缘? 账户里是不是取走了太多钱了? 程序可以通过if语句来测试这些条件。

3.1 基本的比较

这里有几个关于if语句的例子。第一个部分设置了两个变量(a和b)给后面if语句使用。然后两个if语句演示了如何比较两个变量的大小。 按下“Step”健来观察计算机如何执行代码的。

# 在例子中使用的变量
a = 4
b = 5

# 基本的比较
if a < b:
    print("a is less than b")

if a > b:
    print("a is greater than b")

print("Done")
Variables:
a=4
b=5
Output:
a is less than b
Done

因为a是b小的,如果代码能够运行的话第一个语句会被打印出来。 如果变量a和b同时等于4,那么两个if语句都不会打印出任何内容。 4并不比4大,所以if语句的判断会失败。

流程图常被用来展示程序是如何循序渐进的。 大多数不用懂编程知识的人都能读懂一张流程图。来看下你对图例3.1的理解程度如何。

fig.flowchart1
Figure 3.1: Flowchart

这本书跳过了深入分析流程图因为那实在很无聊。但是如果你想成为编程的超级明星,那么请务必去阅读一下
http://en.wikipedia.org/wiki/Flowchart

之前的例子判断了大小。如果两个数相等就无法通过判定的测试。如果要检查大于或者等于, 请看下面这个例子:

if a <= b:
    print("a is less than or equal to b")

if a >= b:
    print("a is greater than or equal to b")

<=>=符号必须按这个次序来使用,且中间不能有空格。比如=<就不工作,< =也不行。

再写这些语句的时候,有些学生喜欢使用≤符号。比如:
if a ≤ b:

这个≤符号在程序中其实并不能工作。 再者,大多数人并不知道如何简单地把它用键盘打出来。(如果你好奇想知道的话,只需要按住'alt'键并同时在数字键盘上输入243。) 所以在写程序的时候,记得是 <=而不是≤。许多人在测试的时候会在这里丢分;不要成为这样的人。

下一组代码用于检测两者是否相等。相等的符号是==,不等的符号是 !=。它们的用法如下:它们

# 相等
if a == b:
    print("a is equal to b")

# 不等
if a != b:
    print("a and b are not equal")
学会使用=和==区别。

在使用===的时候非常容易混淆。 当你想知道两者是否相等时,使用==; 当你想给一个变量赋值时,使用=

下面这个例子展示了在使用===时常见的两个错误:

# 这是错的
a == 1

# 这也是错的
if a = 1:
    print("A is one")

暂停下! 请务必花点时间自己学习下这两个代码示例。现在掌握好了 ===以后就会节省许多时间。千万不要猜。

3.2 缩进

缩进非常重要。if语句下面的每一个缩进的行都只会在条件成立的时候才被执行:

if a == 1:
    print("If a is one, this will print.")
    print("So will this.")
    print("And this.")

print("This will always print because it is not indented.")

缩进的数量必须一致。所以这一段代码不可行。

if a == 1:
  print("Indented two spaces.")
    print("Indented four. This will generate an error.")
   print("The computer will want you to make up your mind.")

一旦if语句完成了,就无法重新缩进了。测试得重新执行。

if a == 1:
    print("If a is one, this will print.")
    print("So will this.")

print("This will always print because it is not indented.")
    print("This will generate an error. Why it is indented?")

3.3 使用And/Or

一个if语句可以通过andor连接多个条件的判断,这时候它们相当于 运算符就像+和-一眼。一样

# And
if a < b and a < c:
    print("a is less than b and c")

# Non-exclusive or
if a < b or a < c:
    print("a is less than either b or c (or both)")
请重复练习。

一种常见的错误是在检查多个条件的时候遗漏了某个变量。下面这段代码就因为计算机不知到如何判断变量 c而无法工作。它无法假设是同a在比较。

# 这是不正确的
if a < b or < c:
    print("a is less than b and c")

3.4 布尔变量

Python支持布尔型变量。什么是布尔型变量?布尔型变量能够存储一个True或者一个False布尔代数是由George Boole在1854年发明的。 多希望他能预见他的成果对奠定现代的计算机逻辑的基础是何等的重要啊!

一个if语句需要一个表达式去判断是True还是False。 看起来可能有些奇怪的是,如果一个变量已经判断为True或者False的话它不需要再做任何比较。

# 布尔型数据。这是合法的!
a = True
if a:
    print("a is true")

在我上学那会儿,说些假的事情很受欢迎。 等三秒中再喊出“其实是假的!”,这举动恐怕连计算机都觉得你无聊。 如果你真的要在写程序时这么做,你需要在开头使用 not运算符。下面这段代码就会用not来让a在真和假之间翻转。

#如何使用not
if not(a):
    print("a is false")

因为not是一个运算符不是一个函数, 括号可以省去。所以下面也是合法的:

# 如何使用not
if not a:
    print("a is false")

也可以使用布尔型变量来配合使用andor运算符。

a = True
b = False

if a and b:
    print("a and b are both true")
谁知道True/False可以这么难?

还可以把比较的结果赋值给一个变量。 在下面这段代码中,变量ab进行了比较。 如果它们是相等的,c会得到True, 否则 c会得到False

a = 3
b = 3
# 下面这行代码看起来很奇怪,但是是合法的。看起来c或者是true或者是false, 取决与a和b是否相当。
c = a == b
# 打印出c的值,在当前情形下是True
print(c)
0表示False。剩下一切都是True.

还有一种方法是创建一个包含某个条件的if语句但是并不去评估是True还是False。这不是很常用的情形,但是对于理解计算机在寻找问题时如何处理这些值很有帮助。 下面这个表达式是合法的,而且会打印出文字来。因为if语句中的值不是0:

if 1:
	print("1")
if "A":
	print("A")

下面这段代码不会被打印,是因为if语句中的值是0所以被视作是False。任何非0的值都被视作是True。

if 0:
	print("Zero")

在下面这段代码中,第一个if语句看起来好像能工作。 问题在于,它会一直判断为True,哪怕a不等于b, 因为后半句中的变量b本身一直是True。

a = "c"
if a == "B" or "b":
	print("a is equal to b. Maybe.")

# 这样正确的写法。
if a == "B" or a == "b":
	print("a is equal to b.")

3.5 Else和Else If语句

下面这段代码会从用户处得到温度,如果很热就会把它打印出来。

temperature = int(input("What is the temperature in Fahrenheit? "))
if temperature > 90:
    print("It is hot outside")
print("Done")

如果程序作者想让温度不高的时候执行程序,她可以使用else语句。 请注意else语句和if语句中的i是如何对齐的,以及在末尾使用的分号,就像if语句一样。语句一样>对于if...else语句, 总有一段代码会被执行。如果if语句是True,那第一段代码会被执行; 如果是False则第二段代码会被执行。

temperature = int(input("What is the temperature in Fahrenheit? "))
if temperature > 90:
    print("It is hot outside")
else:
    print("It is not hot outside")
print("Done")

通过使用else...if语句,我们可以把多个if语句连在一起。 Python把它简化成elif

temperature = int(input("What is the temperature in Fahrenheit? "))
if temperature > 90:
    print("It is hot outside")
elif temperature < 30:
    print("It is cold outside")
else:
    print("It is not hot outside")
print("Done")
Video: Order of logic in the if statements

在下段代码中,哪怕用户输入120度,程序依然会输出“It is hot outside”的结果。 为什么?代码该如何修改?

如果你改不出来,请看视频。

temperature = int(input("What is the temperature in Fahrenheit? "))
if temperature > 90:
    print("It is hot outside")
elif temperature > 110:
    print("Oh man, you could fry eggs on the pavement!")
elif temperature < 30:
    print("It is cold outside")
else:
    print("It is ok outside")
print("Done")

3.6 文本的比较

我们也可以用if语句来检查文本。

user_name = input("What is your name? ")
if user_name == "Paul":
    print("You have a nice name.")
else:
    print("Your name is ok.")

上述例子只会在用户输入“Paul”的时候才成立。用户如果输入 “paul”或者 “PAUL”程序并不能工作。

一种常见的错误是,忘记了在要比较的字符串外的引号。 在下面这个例子中,计算机会以为Paul是一个会存储数值的变量。 它会出一个错误的提示,因为它不完全不知到在变量Paul里存的是什么。 是

user_name = input("What is your name? ")
if user_name == Paul: # This does not work because quotes are missing
    print("You have a nice name.")
else:
    print("Your name is ok.")

3.6.1 多个文本的可能性

当想要把一个变量同多个文本的字符串比较的时候, 一定要记得每个比较都不要漏了变量名。例如:

# 这不可行!因为它永远是true
if user_name == "Paul" or "Mary":

反之,代码应该是这样的是该

# 这是可行的
if user_name == "Paul" or user_name == "Mary":

这是因为,对于任何不是0的值,计算机都以为是True。 所以对计算机来说,"Mary"True没什么区别,所以它总会执行if语句中的内容。

3.6.2 对大小写不敏感的比较

如果一个程序需要比较一个文本是否匹配时无视大小写,那最简单的方法是把所有内容转化成小写。 我们可以通过lower命令来实现。拉来

学会不要太敏感。

下面这个例子会把用户输入的任何信息先转化成小写,然后做比较。重要的一点是,不要把它同有大写的字符串进行比较。否则就不会有任何匹配发生。

user_name = input("What is your name? ")
if user_name.lower() == "paul":
    print("You have a nice name.")
else:
    print("Your name is ok.")

3.7 if语句的例子

Video: If statement examaples

下面这套代码包含了我们之前所讲过的各种概念。 在线的视频对代码的每一行都进行了跟踪分析并作出了解释。

在视频中我使用了一个集成开发编辑器(IDE)叫做Eclipse。默认版本的Eclipse是不支持Python的,但是PyDev版本支持。 PyDev编辑器是可以从这里免费获取的:
http://pydev.org/

编辑器很复杂,但是它有许多选项所以是一个非常强大的编辑环境。许多程序员喜欢使用像PyDev这样可以安装许多便捷的插件的编辑环境,这些强大的插件除了不能帮你倒咖啡别的都会。 而有些开发者则倾向于极简的环境,不被打扰。

# Sample Python/Pygame Programs
# Simpson College Computer Science
# http://programarcadegames.com/
# http://simpson.edu/computer-science/

# Explanation video: http://youtu.be/pDpNSck2aXQ

# Variables used in the example if statements
a = 4
b = 5
c = 6

# Basic comparisons
if a < b:
    print("a is less than b")

if a > b:
    print("a is greater than than b")

if a <= b:
    print("a is less than or equal to b")

if a >= b:
    print("a is greater than or equal to b")

# NOTE: It is very easy to mix when to use == and =.
# Use == if you are asking if they are equal, use =
# if you are assigning a value.
if a == b:
    print("a is equal to b")

# Not equal
if a != b:
    print("a and b are not equal")

# And
if a < b and a < c:
    print("a is less than b and c")

# Non-exclusive or
if a < b or a < c:
    print("a is less than either b or c (or both)")


# Boolean data type. This is legal!
a = True
if a:
    print("a is true")

if not a:
    print("a is false")

a = True
b = False

if a and b:
    print("a and b are both true")

a = 3
b = 3
c = a == b
print(c)

# These are also legal and will trigger as being true because
# the values are not zero:
if 1:
    print("1")
if "A":
    print("A")

# This will not trigger as true because it is zero.
if 0:
    print("Zero")

# Comparing variables to multiple values.
# The first if statement appears to work, but it will always
# trigger as true even if the variable a is not equal to b.
# This is because "b" by itself is considered true.
a = "c"
if a == "B" or "b":
    print("a is equal to b. Maybe.")

# This is the proper way to do the if statement.
if a == "B" or a == "b":
    print("a is equal to b.")

# Example 1: If statement
temperature = int(input("What is the temperature in Fahrenheit? "))
if temperature > 90:
    print("It is hot outside")
print("Done")

# Example 2: Else statement
temperature = int(input("What is the temperature in Fahrenheit? "))
if temperature > 90:
    print("It is hot outside")
else:
    print("It is not hot outside")
print("Done")

# Example 3: Else if statement
temperature = int(input("What is the temperature in Fahrenheit? "))
if temperature > 90:
    print("It is hot outside")
elif temperature < 30:
    print("It is cold outside")
else:
    print("It is not hot outside")
print("Done")

# Example 4: Ordering of statements
# Something with this is wrong. What?
temperature = int(input("What is the temperature in Fahrenheit? "))
if temperature > 90:
    print("It is hot outside")
elif temperature > 110:
    print("Oh man, you could fry eggs on the pavement!")
elif temperature < 30:
    print("It is cold outside")
else:
    print("It is ok outside")
print("Done")

# Comparisons using string/text
# Note, this example does not work when running under Eclipse
# because the input will contain an extra carriage return at the
# end. It works fine under IDLE.
userName = input("What is your name? ")
if userName == "Paul":
    print("You have a nice name.")
else:
    print("Your name is ok.")

3.8 复习

3.8.1 选择题小测验

Click here for a multiple-choice quiz.

3.8.2 练习表

Click here for the chapter worksheet.

3.8.3 实验

Click here for the chapter lab.


You are not logged in. Log in here and track your progress.