小心!选择的陷阱

  在贪吃蛇“大作战”(三)中,我在对原例程代码做修改时不小心“踩进”了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 三个关键词都是表示选择的关键词。其中elifelifelse if等效)与else不能脱离if单独使用(在选择结构中),必须在紧跟在if之后使用,同if一起构成一个选择逻辑。只有if才可以脱离elifelse单独使用。

  

  其次,在同一层级中(所有缩进距离相同的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...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...if...else.选择结构与if...elif...else.选择结构的执行结果是完全不同的!在if...elif...else选择结构中只会执行条件为真语句的主体,else也单独算一个选择语句,和if elif语句一样,是一个选择分支。而在if...if...else.选择结构中,各if选择语句与else语句是分离的,程序是先在if语句中依次进行判断,执行条件为真语句的主体,然后再去执行一遍else语句,else语句是必执行的。(类似try...exception结构中finally的效果)

ps:这个选择的"陷阱"是我自身遇到,并根据验证的结果(现象)与自己的理解,来完成这篇博客的内容。解释的可能不那么专业,但希望对大家有所帮助。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自www.cnblogs.com/3fman/p/9211570.html