• 小心!选择的陷阱


      在贪吃蛇“大作战”(三)中,我在对原例程代码做修改时不小心“踩进”了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语句是相互独立的,并不构成某种结构,每个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:这个选择的"陷阱"是我自身遇到,并根据验证的结果(现象)与自己的理解,来完成这篇博客的内容。解释的可能不那么专业,但希望对大家有所帮助。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    【转载】MongoDB 数据库的备份与恢复
    【转载】Vim命令合集
    【转载】Mac 让 iTerm2 记住用户名密码
    CSS 实现单行、多行文本溢出显示省略号
    【转载】如何在Vue2中实现组件props双向绑定
    JavaScript 获取当日在今年第几周
    CentOS 7 安装配置FTP服务器(vsftpd)
    CentOS 7 防火墙(firewall)常用命令
    Vs Code 之 实现右键打开文件夹
    git 报错
  • 原文地址:https://www.cnblogs.com/3fman/p/9211570.html
Copyright © 2020-2023  润新知