在贪吃蛇“大作战”(三)中,我在对原例程代码做修改时不小心“踩进”了if选择逻辑的“陷阱”,特在此与大家分享,希望大家都能聪明地避开陷阱。
下面是贪吃蛇示例程序的其中一段代码,它是一个选择逻辑:
if a=='': #判断外部命令是否为空
a=s
if a=='w': #判断外部命令是否为‘w’
lc.append([lc[w][0]-1,lc[w][1]])
del lc[0]
s='w'
if a=='s': #判断外部命令是否为‘s’
lc.append([lc[w][0]+1,lc[w][1]])
del lc[0]
s='s'
if a=='a': #判断外部命令是否为‘a’
lc.append([lc[w][0],lc[w][1]-1])
del lc[0]
s='a'
if a=='d': #判断外部命令是否为‘d’
lc.append([lc[w][0],lc[w][1]+1])
del lc[0]
s='d'
if lc[w] in sw: #判断蛇是否刚好吃到食物
lc.insert(0,[lc[0][0],lc[0][1]-1])
del sw[0]
sw.append([random.randint(0,19),random.randint(0,19)])
现在我想增加一个功能,限制外部命令的输入,使其只能是'w','s','a','d'四个字符中的一个,否则出现警告并退出游戏!那么按照我们一贯的思维逻辑我只要在最后加上这样一个else语句就可以了:
else:
print('输入的指令错误(非法指令)!)
exit()
加上这个else语句后,万万没想到,我每次运行这个游戏,无论输入任何指令(包括正确的指令),最终都会出现——“输入的指令错误”(非法指令)! 这个警告,并退出游戏。这令我百思不得其解,苦思操作一番,我终于找到了答案。
要解开这个谜题,就不得不说说if elif else 三者间的关系了。
if elif else 三个关键词都是表示选择的关键词。其中elif(elif与else if等效)与else不能脱离if单独使用(在选择结构中),必须在紧跟在if之后使用,同if一起构成一个选择逻辑。只有if才可以脱离elif与else单独使用。
其次,在同一层级中(所有缩进距离相同的if语句就是在同一层级)的所有if语句,会被依次判断,判断为真的条件语句的主体会被执行,若全为假,则执行“空”;如下面这个例子:
while 1:
a = input("请输入:")
if a == '1':
print('i love you')
if a == '2':
print('i hate you')
if a == '3':
` print('we are family')
注: python3中默认input()函数传递的数据是string类型的
下面是这个例子的一些执行结果:
结果一
如果在上面这个例子的最后加上一个else语句,看看会怎样:
while 1:
a = input("请输入:")
if a == '1':
print('i love you')
if a == '2':
print('i hate you')
if a == '3':
` print('we are family')
else: print('非法输入!')
看看执行结果:
结果二
从执行结果可以看出无论哪个条件成立,最后都要执行一遍esle的主体,这说明在同层级的if结构语句中,else始终会被执行!(所有if语句是相互独立的,并不构成某种结构,每个if语句都会执行一次,如果在最后加一个else语句,则该else语句只与最后一个if语句构成if...else结构)
那么,我们再用if...elif的结构试一试:
while 1:
a = input("请输入:")
if a == '1':
print('i love you')
elif a == '2':
print('i hate you')
elif a == '3':
print('we are family')
# else: print('非法输入!')
执行结果:
结果三
从结果可以看出在if...if结构与if...elif结构的执行逻辑是相同的,都是一次判断条件是否为真,执行条件为真的语句的主体。那么,再加入else语句试试:(if...elif...else整体会构成一种结构)
结果四
比较结果二与结果是可以看出:if...if...else.选择结构与if...elif...else.选择结构的执行结果是完全不同的!在if...elif...else选择结构中只会执行条件为真语句的主体,else也单独算一个选择语句,和if elif语句一样,是一个选择分支。而在if...if...else.选择结构中,各if选择语句与else语句是分离的,程序是先在if语句中依次进行判断,执行条件为真语句的主体,然后再去执行一遍else语句,else语句是必执行的。(类似try...exception结构中finally的效果)
ps:这个选择的"陷阱"是我自身遇到,并根据验证的结果(现象)与自己的理解,来完成这篇博客的内容。解释的可能不那么专业,但希望对大家有所帮助。