day21 04 三级菜单

1.使用递归调用的方法

整体代码类型比较简单如下:
menu={'北京':{'海淀':{'a':{},'h':{},'c':{}},'昌平':{'沙河':{},'天通苑':{},'回龙观':{}},'朝阳':{},'东城':{}}
,'上海':{'闵行':{'d':{},'f':{},'g':{}},'阐北':{},'浦东':{}}
,'山东':{}}
l=[menu]
def threeLM(dic):
while True:
for key in dic:print(key)
key=input('input>>').strip()
if key=='b' or key=='q':return key
elif key in dic.keys() and dic[key]:
ret=threeLM(dic[key])
if ret=='q':return 'q'
threeLM(menu)

对每次用户输入与调用进行详细展开分析:

#第一次调用:dic=menu
def threeLM(dic):
while True:#进来就是死循环
for key in dic:print(key) #. 打印 北京 上海 山东
key=input('input>>').strip() #. 用户输入 北京 上海 山东 其中一个,假设输入北京
#.用户输入 打印 海淀 昌平 朝阳 东城 其中一个,假设输入昌平
if key=='b' or key=='q':return key
elif key in dic.keys() and dic[key]: #. 输入的key在字典里面,且字典不为空
ret=threeLM(dic[key]) #. 再次调用函数,把输入的字典传进去,比如输入北京则将 # 接收#17返回的q ret=q
# {'海淀':{'a':{},'b':{},'c':{}},'昌平':{'沙河':{},'天通苑':{},'回龙观':{}},'朝阳':{},'东城':{}}
# 这个字典传进去,再次循环
if ret=='q':return 'q' # return q 函数就结束了,所以用户输入q结果就是退出程序
threeLM(menu) #第二次调用:dic={'海淀':{'a':{},'b':{},'c':{}},'昌平':{'沙河':{},'天通苑':{},'回龙观':{}},'朝阳':{},'东城':{}}
def threeLM(dic):
while True:#进来就是死循环
for key in dic:print(key)
#5. 打印 海淀 昌平 朝阳 东城
#13 elif语句结束后 又开始循环,打印 海淀 昌平 朝阳 东城,所以#10的地方输入b结果就是返回上一级菜单
key=input('input>>').strip()
#6. 用户输入 打印 海淀 昌平 朝阳 东城 其中一个,假设输入昌平
if key=='b' or key=='q':return key
elif key in dic.keys() and dic[key]: #. 输入的key在字典里面,且字典不为空
ret=threeLM(dic[key])#. 再次调用函数,把输入的字典{'沙河':{},'天通苑':{},'回龙观':{}}传进去,再次循环
#12 接收#11返回的值,ret=b 不符合下面的if条件,所以elif语句结束了
#16 接收#15返回的值,ret=q 符合下面的if语句
if ret=='q':return 'q' #17 将q返回上个调用的地方,即#4的地方
threeLM(menu) #第三次调用:dic={'沙河':{},'天通苑':{},'回龙观':{}}
def threeLM(dic):
while True:#进来就是死循环
for key in dic:print(key)
#9. 打印 沙河 天通苑 回龙观
key=input('input>>').strip() #. 假设用户输入的是b #14 假设用户在这里输入q
if key=='b' or key=='q':return key #. return b 给前面调用的地方即‘#’的地方 #15 return q给前面调用的地方
elif key in dic.keys() and dic[key]:
ret=threeLM(dic[key])
if ret=='q':return 'q'
threeLM(menu)

运行结果:

C:\Users\sku1-\PycharmProjects\untitled\venv\Scripts\python.exe "C:/Users/sku1-1/PycharmProjects/untitled/day 21 04 三级菜单.py"
山东
北京
上海
input>>北京
昌平
海淀
东城
朝阳
input>>海淀
a
c
h
input>>b
昌平
海淀
东城
朝阳
input>>q Process finished with exit code

其中比较绕的地方就是当用户输入b和q的时候了:

用户输入b----返回上一级菜单:利用给调用的地方(上一级菜单)返回一个值b,然后结束语句,就在上一级继续循环

用户输入q----退出程序:通过一层一层的返回q值,知道退出程序

2.使用堆栈的方法

代码如下:

menu={'北京':{'海淀':{'a':{},'h':{},'c':{}},'昌平':{'沙河':{},'天通苑':{},'回龙观':{}},'朝阳':{},'东城':{}}
,'上海':{'闵行':{'d':{},'f':{},'g':{}},'阐北':{},'浦东':{}}
,'山东':{}}
l=[menu] #首先有一个栈
while True:
for key in l[-]:print(key)#l[-]是最后一个值,从最后一个开始打印,先进后出 l[-]=menu 打印北京 上海 山东
k=input('input>>').strip() #用户输入北京
if k in l[-].keys() and l[-][key]:#判断输入的在不再字典当中以及是不是为空,如果为真执行下面的代码
l.append(l[-][k]) #将北京的字典放入l中,此时l=[menu,{海淀。。。。}],再while True 循环,又取的最后一个
#如果知道这里已经可以进去了,但是出不去
elif k=='b':
l.pop() #把这一级菜单删除,直接就返回上级菜单
elif k=='q':break #用户输入q退出程序
else:continue

运行结果:

C:\Users\sku1-\PycharmProjects\untitled\venv\Scripts\python.exe C:/Users/sku1-/PycharmProjects/untitled/三级菜单.py
山东
北京
上海
input>>北京
东城
昌平
朝阳
海淀
input>>昌平
沙河
天通苑
回龙观
input>>b
东城
昌平
朝阳
海淀
input>>q Process finished with exit code

返回上一级菜单所作的操作:把原来所在的本级菜单直接删除,就剩下上一级菜单了

 

day21 04 三级菜单的更多相关文章

  1. Python 三级菜单 增强版

    需要实现的功能是:三级菜单1.从文本内读出选项2.查询每一级的选项,并能对选项进行增/删/改功能3.每一级可以退出程序或者返回上一层 2018-5-14 更新内容 思路 实现过程中的BUG及解决方案: ...

  2. python学习笔记(字符串操作、字典操作、三级菜单实例)

    字符串操作 name = "alex" print(name.capitalize()) #首字母大写 name = "my name is alex" pri ...

  3. css三级菜单效果

    一个简单实用的css三级菜单效果 <!doctype html> <html> <head> <meta charset="utf-8"& ...

  4. python成长之路-----day1-----作业(登录程序和三级菜单)

    作业: 作业1:用户登录 1)程序说明: a.用户输入密码验证成功然后打印欢迎信息 b.如果密码错误,用户登录失败,提示用户,密码错误 c.用户输入密码错误3次,则用户锁定 d.当用户多次输入不存在的 ...

  5. Python之路 day2 字典练习题之 三级菜单

    #Author:ersa ''' 程序: 三级菜单 要求: 打印省.市.县三级菜单 可返回上一级 可随时退出程序 ''' menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{ ...

  6. python3 三级菜单

    python版本3.5 功能: 1.程序执行显示一级菜单,输入内容进入二级菜单: 2.进入二级菜单后,输入二级菜单内容,进入三级菜单:输入b返回一级菜单: 3.进入三级菜单后,输入b返回二级菜单. # ...

  7. 用jQuery做一个三级菜单,鼠标移动到二级菜单的选项上,然后再迅速离开后,当鼠标再移动到该一级菜单或其他二级菜单选项,三级菜单也会显示。

    用jQuery做一个三级菜单,鼠标移动到二级菜单的选项上,然后再迅速离开后,当鼠标再移动到该一级菜单或其他二级菜单选项,三级菜单也会显示. 原因:在为一个元素绑定hover事件之后,用户把光标移入元素 ...

  8. day1作业--三级菜单

    作业概述: 写一个三级菜单 实现如下功能: (1)可依次选择进入各子菜单 (2)在每一级按“b”都可以返回上一级,按“q"都可以退出 流程图: readme: 简介: three_menu. ...

  9. python打怪之路【第三篇】:利用Python实现三级菜单

    程序: 利用Python实现三级菜单 要求: 打印省.市.县三级菜单 可返回上一级 可随时退出程序 coding: menu = { '北京':{ '朝阳':{ '国贸':{ 'CICC':{}, ' ...

随机推荐

  1. 11.3NOIP模拟赛

    /* 考虑贪心 把原序列排序后,对于原中位数往后所有比要更改到的值小的都改成它 正确性显然. */ #include<iostream> #include<cstdio> #i ...

  2. Luogu P1195/P1892 口袋的天空/BOI团伙 【最小生成树/并查集】By cellur925

    其实这俩题挺水的,团伙拿下了一血,但是感觉还是写一下博客比较好x. 一.团伙 题目描述 1920年的芝加哥,出现了一群强盗.如果两个强盗遇上了,那么他们要么是朋友,要么是敌人.而且有一点是肯定的,就是 ...

  3. jenkins一次构建两次触发job问题

    具体内容详见: https://issues.jenkins-ci.org/browse/JENKINS-21464?focusedCommentId=250183&page=com.atla ...

  4. 51nod 1874 字符串排序

    1874 字符串排序  基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 定义一个字符串的无序度为所有位置后面的字母比该位置的字母小的总数之和.比如&q ...

  5. ACM_求N^N的最高位数

    Leftmost Digit Time Limit: 2000/1000ms (Java/Others) Problem Description: 给定一个正整数N,你应该输出N ^ N的最左边的数字 ...

  6. 3、InputStream

    package com.io.file; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoun ...

  7. form表单ajaxSubmit提交并验证

    html: <form class="register-form" action="{:U('')}" method="post"&g ...

  8. "CSRF token missing or incorrect."的解决方法.

    现象: Forbidden (403)CSRF verification failed. Request aborted.HelpReason given for failure:CSRF token ...

  9. wordpress在撰写新文章界面的显示选项按钮点击无反应的解决办法

    原文链接:wordpress在撰写新文章界面的显示选项按钮点击无反应的解决办法 最近升级wordpress之后,发现在文章编辑界面的添加新媒体和可视化按钮点击无反应,如下:  然后就在网上找解决办法, ...

  10. 关于TREEVIEW的ONSELECTEDNODECHANGED事件

    MSDN:http://msdn.microsoft.com/zh-cn/library/system.web.ui.webcontrols.treeview.selectednodechanged( ...