首先写readme文档
作业:写多级菜单,比如京东的收货地址
三级菜单
可依次选择进入子菜单
需要用到的知识:字典、列表
针对此菜单的程序设计使用到了yaml格式的文本,由python对其内容将其解析为多重字典,然后对字典进行遍历,输出三重菜单
注:其中段杠’-'会被解析为数组,冒号‘:’会被解析为字典
类型为文本的pro在Pycharm中可以创建
步骤为:
然后点击new—File,接下来
然后就创建好了,接下来就开始写pro文件,格式为:
程序流程图
代码块
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) ###调用第一层省份或直辖市输出函数###
接下来完美运行,耶!