判断语句
到目前为止,我们的程序还不算很有趣,我们的代码还只是一组简单的语句,只会按照顺序从上到下依次执行,其实电脑之所以能做很多自动化的任务,是因为它可以自己做条件判断。在本章中我们将通过一个石头剪刀布的游戏来掌握判断语句。 首先我们来拆解一下这个游戏,也就是分析一下游戏由哪几部分组成:
- 用户启动游戏: A. 电脑确定它的选择;
- 游戏开始: A. 得到用户的选择; B. 检查用户的选择,如果是非法的(不是石头、剪刀或者布),就返回到步骤2A;如果与电脑的选择相同,就设置为平局,转向步骤3; C. 按规则确定谁是赢家;
- 游戏结束: A. 告诉用户谁是赢家,另外给出电脑的选择; 整个过程可以通过流程图表示出来:
游戏开始的第一步,我们先让电脑选择石头或者剪刀或者布,当然了这个选择一定要是随机的,并且在最终答案揭晓之前玩家是不知道的。接下来我们首先来学习一下在python中如何得到随机数
生成随机数
python提供了很多内置的功能,这些内置的功能以模块(也称为库)的形式存在,模块的概念我们以后还会深入讲解,这里我们先学习如何使用。对于随机数,要使用的模块叫random模块,用法如下:
import random
import是导入的意思,random就是随机数模块的名称;导入随机数模块之后就可以使用生成随机数的功能了,用法如下:
random.randint(0.2)
这句话的意思是生成0到2范围内的一个随机整数,有可能是0,1或者2. 你可以试一下如下的代码:
import random
random_choice = random.randint(0,2)
print(random_choice)
print("电脑选择的是:", random_choice)
现在我们已经实现了随机的功能,但是随机出来的是0,1,2并不是我们期望的石头剪刀布,所以接下来我们要尝试把生成的随机数转换一下,这时候就得学习本章的核心主题了:判断语句,通过判断语句让程序能够自己做决定。
True or False
为了让程序能够做决定,首先它得知道一件事儿是对的还是错的,这个对和错的表示方法跟英语判断题里用的T和F是同样的单词:T就是True的缩写,也就是对的、成立的;F就是False的缩写,也就是错的、不成立的。这个True和False在Python里是一个全新的类型,叫布尔值,这个了解即可,但是需要特别注意的是True和False的首字母是大写的,并且没有加引号。 考考你,如果加了引号是什么数据类型? 你可以在IDLE中执行如下代码,直观体验一下True和False是如何产生的:
age = 20
age > 18
age = 18
age > 18
age = 10
age >= 18
age == 18
age != 18
判断语句if
认识了True和False这个布尔类型之后我们就可以进一步学习怎么让程序做决定了,这时候if语句就出场了,if语句结合布尔类型就可以实现判断的功能,比如下面的例子: 输入用户年龄,根据年龄打印不同的内容,在python程序中,用if语句实现:
age = 20
if age >= 18:
print('your age is', age)
print('adult') #adult:成人
根据python的缩进规则,如果if
语句判断是True
,就把缩进的两行print语句执行了,否则,什么也不做。也可以给if
添加一个else
语句,意思是,如果if
判断是False
,不要执行if
的内容,去把else
执行了:
age = 3
if age >= 18:
print('your age is', age)
print('adult')
else:
print('your age is', age)
print('teenager') #teenager:青少年
注意不要少写了冒号:
。 当然上面的判断是很粗略的,完全可以用elif
做更细致的判断:
age = 3
if age >= 18:
print('adult')
elif age >= 6:
print('teenager')
else:
print('kid') #kid:小孩子
elif
是else if
的缩写,完全可以有多个elif
,所以if语句的完整形式就是:
if <条件判断1>:
<执行1>
elif <条件判断2>:
<执行2>
elif <条件判断3>:
<执行3>
else:
<执行4>
if
语句执行有个特点,它是从上往下判断,如果在某个判断上是True
,把该判断对应的语句执行后,就忽略掉剩下的elif
和else
,所以,请测试并解释为什么下面的程序打印的是teenager:
age = 20
if age >= 6:
print('teenager')
elif age >= 18:
print('adult')
else:
print('kid')
回到石头剪刀布
有了判断功能之后,我们就可以优化我们的代码了,通过if语句判断得到的是0的话,则转换成“石头”,依次类推,代码如下:
import random
random_choice = random.randint(0,2)
#print("电脑选择的是:", random_choice) 将这一行注释掉,通过下面的代码进行转换
if random_choice == 0:
computer_choice = '石头'
elif random_choice == 1:
computer_choice = '布'
else:
computer_choice = '剪刀'
print("电脑选择的是",computer_choice)
得到玩家的选择
现在电脑已经做出了自己的随机选择,接下来该玩家做出选择了,这时候就用到我们之前学过的input函数,让玩家用户自己来输入自己的选择并且把输入的内容存储到一个变量中。代码如下:
import random
random_choice = random.randint(0,2)
if random_choice == 0:
computer_choice = '石头'
elif random_choice == 1:
computer_choice = '布'
else:
computer_choice = '剪刀'
#print("电脑选择的是",computer_choice) 把这一行注释掉,不提前暴漏电脑的选择
user_choice = input('石头、剪刀还是布?')
print('你选择的是:',user_choice,";电脑选择的是:",computer_choice)
检测平局
得到了电脑的选择和玩家的选择之后就可以进行下一步了,根据我们的流程图,这里有3种可能:
- 玩家和电脑做了相同的选择,我们得到一个平局;
- 玩家和计算机做了不同的选择,我们需要确定谁是赢家;
- 用户输入一个非法的选择,需要重新输入;
我们首先完成第一步检测平局,利用前面学到的if判断语句,我们可以判断一下电脑的选择跟玩家的选择是否相同,如果相同的话则设定为平局,代码如下:
import random
random_choice = random.randint(0,2)
if random_choice == 0:
computer_choice = '石头'
elif random_choice == 1:
computer_choice = '布'
else:
computer_choice = '剪刀'
user_choice = input('石头、剪刀还是布?')
print('你选择的是:',user_choice,"电脑选择的是",computer_choice) #也可以把这一段注释或者删除掉
if computer_choice == user_choice:
winner = '平局'
print(winner)
其中winner变量是我们用来记录最后的赢家的,如果是平局的话也暂时存在这个变量里,后面我们再来进一步优化代码。你可以试试运行这段代码,看能不能得到平局的情况呢?友情提示,有可能需要运行很多次才可以,这时候你一定很像让程序自动重复运行,别慌,后面我们会讲解重复运行的功能。
谁是赢家?
如果电脑选择跟玩家选择不相同的话,就得判断出来谁是赢家了,这时候我们需要首先梳理一下电脑赢的情况有哪些:
- 如果电脑选择布,并且玩家选择石头,那么电脑赢;
- 如果电脑选择石头,并且玩家选择剪刀,那么电脑赢;
- 如果电脑选择剪刀,并且玩家选择布,那么电脑赢;
接下来我们也可以按照同样的方法梳理出玩家赢的情况,但是有更简单的方法:我们已经把平局和电脑赢的情况都梳理出来了,那么剩下的是不是就都是玩家赢的情况了呢? 在具体代码之前,我们需要学习一个新知识:怎么在Python里面表示并且?这个也很简单,用and这个单词,比如:
age > 5 and age < 10
更进一步,Python中除了可以表示并且,还有两个跟并且类似的经常用的关键词:or和not. or是或者的意思,比如:
age > 5 or age == 5
not是反过来的意思,比如:
not (age < 5)
思考一下当age=6时上面的表达式的结果是什么?当age=11时结果又是什么?当age=5时结果又是什么?
回到我们的石头剪刀布的游戏,我们利用and并且的功能来实现谁是赢家的判断,代码如下:
import random
random_choice = random.randint(0,2)
if random_choice == 0:
computer_choice = '石头'
elif random_choice == 1:
computer_choice = '布'
else:
computer_choice = '剪刀'
user_choice = input('石头,剪刀,布?')
if computer_choice == user_choice:
winner = '平局'
elif computer_choice == '布' and user_choice == '石头':
winner = '电脑'
elif computer_choice == '石头' and user_choice == '剪刀':
winner = '电脑'
elif computer_choice == '剪刀' and user_choice == '布':
winner = '电脑'
else:
winner = '玩家'
print(winner,'赢了!')
多运行几遍程序,把三种结果都尝试出来,是不是会出现“平局赢了”这样奇怪的字眼,所以接下来我们对最终的结果进行一下优化。
优化输出结果
如果平局,我们输出:平局!我们都选择了xx。如果没有平局,我们输出:xx赢了,玩家选择了xx,电脑选择了xx。 代码如下:
#print(winner,'赢了!')
if winner == '平局':
print("平局!我们都选择了",user_choice)
else:
print(winner,"赢了,玩家选择了",user_choice,",电脑选择了",computer_choice)
处理非法输入
我们希望运行程序的时候玩家输入的是石头或者剪刀或者布,但实际上玩家会不会输入其他内容呢? 大概率是有可能的,你也可以试试会有什么结果。那如何知道用户输入的内容是不是非法的呢?我们也可以通过判断语句来实现,代码如下:
user_choice = input('石头,剪刀,布?')
if user_choice != '石头' and user_choice != '布' and user_choice != '剪刀':
user_choice = input('输入错误,请重新输入!石头,剪刀,布?')
这段代码比较长,要好好理解一下,它的意思是如果玩家的输入不是石头并且不是布并且不是剪刀,那么意味着玩家的输入是非法输入,这时候程序就提示玩家:输入错误,请重新输入了。 尝试运行代码,有没有发现什么问题?当我们第二次输入也是非法的时候,就不会再提示我们重新输入了!怎么解决这个问题,让用户不断输入直到输入正确的内容才进行后续的判断赢家呢?这个就用到Python中的循环语句了,把我们程序中的if修改为while就可以实现这个功能了,这样你就完成了石头剪刀布的游戏了,快去试试吧!关于循环语句while的具体用法我们到下一章中详细讲解。
import random
random_choice = random.randint(0,2)
if random_choice == 0:
computer_choice = '石头'
elif random_choice == 1:
computer_choice = '布'
else:
computer_choice = '剪刀'
user_choice = input('石头,剪刀,布?')
while user_choice != '石头' and user_choice != '布' and user_choice != '剪刀':
user_choice = input('输入错误,请重新输入!石头,剪刀,布?')
if computer_choice == user_choice:
winner = '平局'
elif computer_choice == '布' and user_choice == '石头':
winner = '电脑'
elif computer_choice == '石头' and user_choice == '剪刀':
winner = '电脑'
elif computer_choice == '剪刀' and user_choice == '布':
winner = '电脑'
else:
winner = '玩家'
#print(winner,'赢了!')
if winner == '平局':
print("平局!我们都选择了",user_choice)
else:
print(winner,"赢了,玩家选择了",user_choice,",电脑选择了",computer_choice)