跳转至

Topic 7.3 - while 无限循环的程序设计

到目前为止,大家已经写过许多的程序了,但是目前大家写的程序和大家在实际生活中接触到的程序有个很大的区别:

  • 大家在目前为止所写的程序,都是程序在指定完特定的指令后就终止了

  • 但是大家在实际生活中接触到的手机或电脑程序,在执行完特定的指令后,程序并没有终止,而是会继续运行,等待用户的下一步操作。

  • 其实,这些程序的运行原理,就是使用了无限循环

本节我们就来使用无限循环来设计一个简单的动物园程序。

  • 由于 .ipynb 文件中用户交互不方便,本节我们将在 .py 文件中编写代码
  • .ipynb 文件仅用于讲解代码逻辑,代码部分使用非运行状态展示

1. 程序功能需求

程序需求:

  • 用户刚进入程序的时候,看到标题页面和菜单
  • 菜单提示用户可以选择查看不同的动物,也可以选择退出程序
  • 根据用户不同的输入,展示不同的动物,展示完后,提示用户退回到菜单
  • 如果用户选择退出程序,程序终止
  • 如果用户输入错误(不是看动物或退出的指令),提示用户重新输入

2. 程序设计思路

程序设计思路:

  • 首先,我们需要一个无限循环来让程序不断运行,直到用户选择退出程序。

  • 然后,在循环内部,我们需要展示标题页面和菜单,提示用户可以选择查看不同的动物或退出程序。

  • 接着,我们需要一个变量来接收用户输入,然后用条件语句来判断用户的输入:

    • 如果用户输入的是查看动物的指令,我们就展示对应的动物信息,然后提示用户退回到菜单

    • 如果用户输入的是退出程序的指令,我们就终止循环,结束程序

    • 如果用户输入的是错误的指令,我们就提示用户重新输入

  • 根据这个设计思路,我们可以大致写出程序的伪代码:

while True:

    展示标题页面和菜单

    用户输入 = 获取用户输入()

    if 用户输入 == "查看动物1":
        展示动物1
        提示用户退回到菜单
    elif 用户输入 == "查看动物2":
        展示动物2
        提示用户退回到菜单
    elif 用户输入 == "查看动物3":
        展示动物3
        提示用户退回到菜单
    elif 用户输入 == "退出程序":
        break
    else:
        提示用户重新输入

在这个程序中,最外层的无限循环 while True: 就是程序的主循环

  • 程序会不断地执行循环内部的代码,直到遇到 break 语句跳出循环
  • 使用主循环可以不断地响应用户的输入,直到用户选择退出程序,这也是大多数实际程序的运行原理

但是这个伪代码框架有一个问题:

  • 如果用户输入有误,我们提示用户重新输入后,程序会直接回到标题和菜单,而我们其实只想用户重新输入而已,不用再次展示标题和菜单
  • 因此,我们可以把展示标题和菜单的代码放在循环的最开始部分,而把获取用户输入和判断用户输入的代码放在一个内层的循环中
  • 内层循环的逻辑是,只要用户的输入有误,就一直提示用户重新输入,直到用户输入正确为止
  • 改进后的伪代码如下:
while True:

    展示标题页面和菜单

    while True:
        用户输入 = 获取用户输入()
        if 用户输入是正确的:
            break

    if 用户输入 == "查看动物1":
        展示动物1
        提示用户退回到菜单
    elif 用户输入 == "查看动物2":
        展示动物2
        提示用户退回到菜单
    elif 用户输入 == "查看动物3":
        展示动物3
        提示用户退回到菜单
    elif 用户输入 == "退出程序":
        break

3. 程序代码实现

根据上面的设计思路,我们可以写出程序代码框架,我们将以下代码放入 zoo_v1.py 文件中:

while True:

    # TODO: 展示一个漂亮一点的标题

    print("欢迎来到动物园!请选择你想查看的动物:")
    print("输入 '1':看骆驼")
    print("输入 '2':看牛")
    print("输入 '3':看马")
    print("输入 'q':退出程序")

    while True:
        user_input = input("请输入你的选择: ")
        if user_input in ['1', '2', '3', 'q']:
            break
        else:
            print("输入有误,请重新输入")

    if user_input == '1':
        # TODO: 展示骆驼
        pass
    elif user_input == '2':
        # TODO: 展示牛
        pass
    elif user_input == '3':
        # TODO: 展示马
        pass
    elif user_input == 'q':
        print("感谢你的访问,欢迎下次再来!")
        break

在这段代码中,我们看到程序开发中的两个重要的工具:

  • pass 占位符,表示这里暂时不做任何操作,Python 在看到 pass 时会什么都不做,直接跳过
  • TODO 注释,在注释里加入 TODO 可以提醒我们这里有未完成的任务,它本质是注释不会影响程序运行,但是很多 Python 编辑器会自动识别 TODO 注释,并在侧边栏列出所有的 TODO 注释,方便我们查看和管理未完成的任务

4. 完整的程序代码

我们从互联网上找了一些骆驼、牛、马的 ASCII 艺术图案,放在程序中展示:

完整的程序代码如下,我们将以下代码放入 zoo_v2.py 文件中:

ascii_camel = r"""
        _
    .--' |
   /___^ |     .--.
       ) |    /    \
      /  |  /`      '.
     |   '-'    /     \
     \         |      |\
      \    /   \      /\|
       \  /'----`\   /
       |||       \\ |
       ((|        ((|
       |||        |||
      //_(       //_(
"""

ascii_cow = r"""
    ^__^
    (oo)\_______
    (__)\       )\/\
        ||----w |
        ||     ||
"""

ascii_horse = r"""
                                 |\    /|
                              ___| \,,/_/
                           ---__/ \/    \
                          __--/    (D)(D)\
                          _ -/    (_      \
                         // /       \_ /  -\
   __-------_____--___--/           / \_ O o)
  /                                 /   \__/
 /                                 /
||          )                   \_/\
||         /              _      /  |
| |      /--______      ___\    /\  :
| /   __-  - _/   ------    |  |   \ \
 |   -  -   /                | |     \ )
 |  |   -  |                 | )     | |
  | |    | |                 | |    | |
  | |    < |                 | |   |_/
  < |    /__\                <  \
  /__\                       /___\
"""

assic_title = r"""
    *****************************
    *       欢迎来到动物园       *
    *****************************
"""

while True:

    print(assic_title)

    print("请选择你想查看的动物:")
    print("输入 '1':看骆驼")
    print("输入 '2':看牛")
    print("输入 '3':看马")
    print("输入 'q':退出程序")

    while True:
        user_input = input("请输入你的选择: ")
        if user_input in ['1', '2', '3', 'q']:
            break
        else:
            print("输入有误,请重新输入")

    if user_input == '1':
        print("这是一头骆驼,请看:")
        print(assic_camel)
        input("输入任意内容退回到菜单")
    elif user_input == '2':
        print("这是一头牛,请看:")
        print(ascii_cow)
        input("输入任意内容退回到菜单")
    elif user_input == '3':
        print("这是一匹马,请看:")
        print(ascii_horse)
        input("输入任意内容退回到菜单")
    elif user_input == 'q':
        print("感谢你的访问,欢迎下次再来!")
        break

接着,我们运行这个程序,看看效果如何:

    *****************************
    *       欢迎来到动物园       *
    *****************************

请选择你想查看的动物:
输入 '1':看骆驼
输入 '2':看牛
输入 '3':看马
输入 'q':退出程序
请输入你的选择: 1
这是一头骆驼,请看:

        _
    .--' |
   /___^ |     .--.
       ) |    /    \
      /  |  /`      '.
     |   '-'    /     \
     \         |      |\
      \    /   \      /\|
       \  /'----`\   /
       |||       \\ |
       ((|        ((|
       |||        |||
      //_(       //_(

输入任意内容退回到菜单o

    *****************************
    *       欢迎来到动物园       *
    *****************************

请选择你想查看的动物:
输入 '1':看骆驼
输入 '2':看牛
输入 '3':看马
输入 'q':退出程序
请输入你的选择: 2
这是一头牛,请看:

    ^__^
    (oo)\_______
    (__)\       )\/\
        ||----w |
        ||     ||

输入任意内容退回到菜单o

    *****************************
    *       欢迎来到动物园       *
    *****************************

请选择你想查看的动物:
输入 '1':看骆驼
输入 '2':看牛
输入 '3':看马
输入 'q':退出程序
请输入你的选择: 3
这是一匹马,请看:

                                 |\    /|
                              ___| \,,/_/
                           ---__/ \/    \
                          __--/    (D)(D)\
                          _ -/    (_      \
                         // /       \_ /  -\
   __-------_____--___--/           / \_ O o)
  /                                 /   \__/
 /                                 /
||          )                   \_/\
||         /              _      /  |
| |      /--______      ___\    /\  :
| /   __-  - _/   ------    |  |   \ \
 |   -  -   /                | |     \ )
 |  |   -  |                 | )     | |
  | |    | |                 | |    | |
  | |    < |                 | |   |_/
  < |    /__\                <  \
  /__\                       /___\

输入任意内容退回到菜单o

    *****************************
    *       欢迎来到动物园       *
    *****************************

请选择你想查看的动物:
输入 '1':看骆驼
输入 '2':看牛
输入 '3':看马
输入 'q':退出程序
请输入你的选择: q
感谢你的访问,欢迎下次再来!