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. js实现打字效果

    <!DOCTYPE html> <html> <head> <meta charset='utf-8'> <title>js typing& ...

  2. Elasticsearch的功能、使用场景以及特点

    1.Elasticsearch的功能,干什么的 2.Elasticsearch的适用场景,能在什么地方发挥作用 3.Elasticsearch的特点,跟其他类似的东西不同的地方在哪里 1.Elasti ...

  3. flask请求访问数据

    flask请求访问数据 在flask框架中,访问请求数据由全局的request对象来提供,在flask框架中,request对象具有 全局作用域: from flask import request ...

  4. [CF1076F] Summer Practice Report

    Description Transmission Gate Solution 这一题可以考虑Dp,设\(Dp[i][j]\) 为在第i段中,以j颜色为结尾的最后一小段长度的最小值. 那么可以先考虑以表 ...

  5. 可以装一把——c#中手动添加控件

    TextBox txt = new TextBox(); //文本框控件 //如果想在移动控件位置 point(x,y) txt.Location = new Point(50,50); this.C ...

  6. ava的动态代理机制详解

    在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...

  7. AJPFX分析Android退出应用最优雅的方式

    什么是RS式呢?即Receiver+singleTask .我们知道Activity有四种加载模式,而singleTask就是其中的一种,使用这个模式之后,当startActivity时,它先会在当前 ...

  8. 学习笔记 第八章 使用CSS美化列表

    第8章  使用CSS美化列表 8.1 列表的基本结构 在HTML中,列表结构可以分为两种基本类型:有序列表和无序列表.使用标签如下: <ul>...</ul>:标识无序列表: ...

  9. Windows 下 IIS与Apache 共存

    在Windows服务器下, 安装了IIS以及Apache服务器, 如何使他们一起工作. 目前我面对的问题是, 只有一个IP地址,要通过不同的端口来访问不同的程序. 解决方案如下: 1.找到 Apach ...

  10. Django系列:(1)PyCharm下创建并运行我们的第一个Django工程

    准备工作: 假设读者已经安装好python 2x或3x,以及安装好Django,以及Pycharm. 我的配置: – Python 2.7.11 – Pycharm Professional 5.0. ...