作业1:用python编三级菜单

首先写readme文档

作业:写多级菜单,比如京东的收货地址
三级菜单
可依次选择进入子菜单
需要用到的知识:字典、列表
针对此菜单的程序设计使用到了yaml格式的文本,由python对其内容将其解析为多重字典,然后对字典进行遍历,输出三重菜单
注:其中段杠’-'会被解析为数组,冒号‘:’会被解析为字典
类型为文本的pro在Pycharm中可以创建
步骤为:
第一步
然后点击new—File,接下来
在这里插入图片描述
然后就创建好了,接下来就开始写pro文件,格式为:

程序流程图

流程图是用Process On制作的,很好用推荐给大家

代码块

import sys,re,os,yaml,time
###########################对输入的字符类型进行判断并转换#####################################
def input_handle(s):
    if str.isdigit(s): #判断输入的字符是否是数字
        s=int(s)       #如果是数字,将其转换为整数
    return s

#######################################框架函数###############################################
def framework(province='',city='',county=''):
    os.system('cls')   ###清屏###
    print('''
    ******************************************************************
    *                                                                *
    *                     欢迎访问全国省市查询系统                    *
    *                                                                *
    ******************************************************************


    +-----------------------------------------------------------------
    |           省份:  %s 
    |
    |           市(区): %s 
    |
    |           县(区): %s
    +-----------------------------------------------------------------
    ''' % (province, city, county))

    #######################################输出展示函数#####################################
def display(province_name='',city_name='',county_name='',):
    print('''
    ************************************************************
    *                                                          *
    *                美丽的 %s %s %s  欢迎您                     *
    *                                                          *
    *                                                          *
    *************************************************************
    ''' %(province_name,city_name,county_name))

#################################菜单第一层省份函数##################################3
def province_display(province_list):

    #########定义全局变量###############
    global P_NAME
    global C_NAME
    global X_NAME
    global FLAG_M

    province_dict={}
    ##global语句为定义在函数外的变量赋值,告诉Python,这个变量不是局部的,而是全局变量##
    ################对省份或直辖市列表参数进行遍历并加上数字编号##########
    for k,v in enumerate(province_list,1):
        province_dict[k]=v
        print('%d . %s'% (k,v) + '\t',end='')  ###加上end参数,取消默认换行
        if k % 4==0:                                       #每行输入4列,然后开始换行
            print()                                        #输出一个空行
    print('\n====================================================')
    print('q:exit')

    ###############键盘读入编号或省份,可以输入汉字#################
    province_index=input('请输入省份或者编号:')
    #################如果输入非空,对输入进行判断并转换类型##########
    if len(province_index)!=0:  #判断输入的内容是否非空
        province_index=input_handle(province_index)  #如果非空则对其进行操作

    if province_index=='q': ##如果输入为q,则退出程序
        sys.exit(0)
    elif province_index in province_dict.keys():  ##如果输入为数字,则从字典里获取具体的省份名称或者直辖市
        P_NAME=province_dict[province_index]      ##给全局变量赋值省份名称
    elif province_index in province_dict.values():  ##如果输入的为省份名称在字典的值里
        P_NAME=province_index                       ##直接给全局变量赋值省份名称
    else:
        P_NAME=''                                   ##如果输入的是其他字符,则给此全局变量赋予空值

    while P_NAME:                                    #全局变量不为空,则进入循环
        framework(P_NAME,C_NAME,X_NAME)              #调用框架函数
        if type(yaml_dict[P_NAME]) is list:          #如果城市名称是列表
            city_display(P_NAME)                     #调用城市函数并传入省份值
            if FLAG_M=='b':                          #城市函数输入b,则返回上一级,重新选择省份
                break
        else:
            display(P_NAME)                            #如果城市名称不是列表,则调用展示函数
            time.sleep(5)                               #time.sleep()函数推迟调用线程的运行,5表示进程挂起的时间
            P_NAME=''
            break
    else:
        print('输入错误,请重新输入!')                 ##P_NAME为空,即输入错误
        time.sleep(2)
############################第二层城市输出函数#####################
def city_display(province_name):
    # 定义全局变量#
    global P_NAME
    global C_NAME
    global X_NAME
    global FLAG_M

    city_name=''                                         #定义城市变量为空
    city_list=yaml_dict[province_name]                   #将城市名称赋值给城市列表
    city_dict={}                                         #定义编号和城市名称的字典
    city_county_dict={}                                 #定义编号和地级市和下属区县名称的字典
    ###########对城市列表进行遍历并加上数字编号################################
    for k,v in enumerate(city_list,1):
        if type(v) is str:   #判断v是否是字符串
            city_dict[k]=v  #如果是字符串的话说明他是字典的值
            print('%d . %s' %(k,v)+'\t',end='')   #加上end参数取消默认换行
        elif type(v) is dict:         #如果v是字典,说明它有区县
            for kk,vv in v.items():
                city_dict[k]=kk
                city_county_dict[kk]=vv
                print('%d . %s' % (k,kk)+'\t',end='')
        else:
            pass

        if k % 4 == 0 :      #打印4列后换行
            print()
    print('\n========================================================')
    print('q:exit     b:back')

    ######################键盘输入编号或者区市名称############################
    city_index=input('请输入编号或者区市:')
    if len(city_index) != 0:
        city_index=input_handle(city_index)
    if city_index == 'q':
        sys.exit(0)
    elif city_index == 'b':
        (P_NAME,C_NAME,FLAG_M)=('','','b')
        return
    elif city_index in city_dict.keys():
        city_name=city_dict[city_index]
        (P_NAME, C_NAME, FLAG_M) = (province_name, city_name, '')
    elif city_index in city_dict.values():
        city_name=city_index
        (P_NAME,C_NAME,FLAG_M)=(province_name,city_name,'')
    else:
        pass

    if city_name:
        if city_name in city_county_dict.keys():
            while C_NAME:
                framework(P_NAME,C_NAME,X_NAME)
                ######调用三层区县,并传入具体参数##################
                county_display(P_NAME,C_NAME,city_county_dict[city_name])
                if FLAG_N=='b':
                    break
            else:
                print('输入错误,请重新输入!')
                time.sleep(2)
        else:
            display(P_NAME,C_NAME)
            time.sleep(5)
    else:
        print('输入错误,请重新输入!')
        time.sleep(2)

##############################菜单第三层区县函数########################################3
def county_display(province_name,city_name,county_list):
     ###########全局变量############
     global P_NAME
     global C_NAME
     global X_NAME
     global FLAG_N

     county_name=''
     county_dict={}
    ###################对区县列表参数进行遍历并赋予编号########################
     for k,v in enumerate(county_list,1):
         if type(v) is str:
            county_dict[k]=v
            print('%d . %s'%(k,v)+'\t',end='')

         if k % 4 ==0:
            print()
     print('\n=============================================')
     print('q:exit   b:back')


    ############################键盘键入编号或者区县######################
     county_index=input('请输入编号或区县名称:')
     if len(county_index) != 0:
         county_index=input_handle(county_index)

         if county_index =='q':
            sys.exit(0)
         elif county_index=='b':
             (P_NAME,C_NAME,X_NAME,FLAG_N)=(province_name,'','','b')
             return
         elif county_index in county_dict.keys():

             county_name=county_dict[county_index]
             (P_NAME,C_NAME,X_NAME,FLAG_N)=(province_name,city_name,county_name,'')
         elif county_index in county_dict.values():
             county_name=county_index
             (P_NAME,C_NAME,X_NAME,FLAG_N)=(province_name,city_name,county_name,'')
         else:
             (P_NAME,C_NAME,X_NAME,FLAG_N)=(province_name,city_name,'','')

         if county_name:

             display(P_NAME,C_NAME,X_NAME)
             time.sleep(5)
         else:
             print('输入错误,请重新输入!')
             time.sleep(2)


###########################主程序#########################
fd=open('D:\pro','rb')
yaml_dict=yaml.load(fd)
###############定义全局变量###########################
P_NAME = ''                                             ###省份或直辖市全局变量###
C_NAME = ''                                             ###各省地级市或直辖市区县的全局变量###
X_NAME = ''                                             ###各省地级市下的区或县 全局变量###
FLAG_M = ''                                             ###退出菜单第二层,返回上一层循环的变量###
FLAG_N = ''                                             ###退出菜单第三层,返回上一层循环的变量###
###############获取省份或直辖市的列表#################
prov_list=yaml_dict.keys()
###############主循环开始#############################
while True:
    framework(P_NAME, C_NAME, X_NAME)  ###调用框架函数,显示初始状态###
    province_display(prov_list)  ###调用第一层省份或直辖市输出函数###

接下来完美运行,耶!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值