这是刚开始写程序,三级菜单的程序基本是用字典实现,很low,以后学习了其他更好的东西,我会继续上传,然后争取在我水平高深之后,把这个简单的东西实现的狠高大上。

一,三级菜单

要求:

  • 可依次选择进入各子菜单
  • 可从任意一层往回退到上一层
  • 可从任意一层退出程序
  • 所需新知识点:列表、字典'''

数据结构如下:

  1. menu = {
  2. '北京':{
  3. '海淀':{
  4. '五道口':{
  5. 'soho':{},
  6. '网易':{},
  7. 'google':{}
  8. },
  9. '中关村':{
  10. '爱奇艺':{},
  11. '汽车之家':{},
  12. 'youku':{},
  13. },
  14. '上地':{
  15. '百度':{},
  16. },
  17. },
  18. '昌平':{
  19. '沙河':{
  20. '老男孩':{},
  21. '北航':{},
  22. },
  23. '天通苑':{},
  24. '回龙观':{},
  25. },
  26. '朝阳':{},
  27. '东城':{},
  28. },
  29. '上海':{
  30. '闵行':{
  31. "人民广场":{
  32. '炸鸡店':{}
  33. }
  34. },
  35. '闸北':{
  36. '火车战':{
  37. '携程':{}
  38. }
  39. },
  40. '浦东':{},
  41. },
  42. '山东':{},
  43. }

  

1,一个简单的三级菜单的实现

  代码如下:

  1. menu = {
  2. '北京': {
  3. '海淀': {
  4. '五道口': {
  5. 'soho': {},
  6. '网易': {},
  7. 'google': {}
  8. },
  9. '中关村': {
  10. '爱奇艺': {},
  11. '汽车之家': {},
  12. 'youku': {},
  13. },
  14. '上地': {
  15. '百度': {},
  16. },
  17. },
  18. '昌平': {
  19. '沙河': {
  20. '老男孩': {},
  21. '北航': {},
  22. },
  23. '天通苑': {},
  24. '回龙观': {},
  25. },
  26. '朝阳': {},
  27. '东城': {},
  28. },
  29. '上海': {
  30. '闵行': {
  31. "人民广场": {
  32. '炸鸡店': {}
  33. }
  34. },
  35. '闸北': {
  36. '火车战': {
  37. '携程': {}
  38. }
  39. },
  40. '浦东': {},
  41. },
  42. '山东': {},
  43. }
  44.  
  45. while True:
  46. for k in menu:
  47. print(k)
  48. choice1 = input("请输入地址(按b返回上一层,按q退出程序)\n").strip()
  49. if not choice1:
  50. continue
  51. if choice1 in menu:
  52. while True: # 进入第二层
  53. for k in menu[choice1]:
  54. print(k)
  55. choice2 = input("请输入地址(按b返回上一层,按q退出程序)\n").strip()
  56. if not choice2:
  57. continue
  58. if choice2 in menu[choice1]:
  59. while True: # 进入第三层
  60. for k in menu[choice1][choice2]:
  61. print(k)
  62. choice3 = input("请输入地址(按b返回上一层,按q退出程序)\n").strip()
  63. if not choice3:
  64. continue
  65. if choice3 in menu[choice1][choice2]:
  66. print("go to ", menu[choice1][choice2][choice3])
  67. elif choice3 == 'q':
  68. exit("再见,欢迎再次使用")
  69. elif choice3 == 'b':
  70. break
  71. else:
  72. print("节点不存在")
  73. elif choice2 == 'b':
  74. break
  75. elif choice2 == 'q':
  76. exit("再见 ,欢迎再次使用")
  77. else:
  78. print("节点不存在")
  79.  
  80. elif choice1 == 'q':
  81. print("再见 ,欢迎再次使用")
  82. break
  83. elif choice1 == 'b':
  84. print("已经是最高层了,没有上一层")
  85. break

  此方法当然可以实现,就是代码比较冗余。

2,一个高级的三级菜单的实现

  只用一个while循环,且整体代码量少于15行

  1. menu = {
  2. '北京':{
  3. '海淀':{
  4. '五道口':{
  5. 'soho':{},
  6. '网易':{},
  7. 'google':{}
  8. },
  9. '中关村':{
  10. '爱奇艺':{},
  11. '汽车之家':{},
  12. 'youku':{},
  13. },
  14. '上地':{
  15. '百度':{},
  16. },
  17. },
  18. '昌平':{
  19. '沙河':{
  20. '老男孩':{},
  21. '北航':{},
  22. },
  23. '天通苑':{},
  24. '回龙观':{},
  25. },
  26. '朝阳':{},
  27. '东城':{},
  28. },
  29. '上海':{
  30. '闵行':{
  31. "人民广场":{
  32. '炸鸡店':{}
  33. }
  34. },
  35. '闸北':{
  36. '火车战':{
  37. '携程':{}
  38. }
  39. },
  40. '浦东':{},
  41. },
  42. '山东':{},
  43. }
  44. current_layer = menu
  45. parent_list = []
  46. while True:
  47. for key in current_layer:
  48. print(key)
  49. choice = input("请输入地址,或者按b返回上一层,按q退出程序>>>:").strip()
  50. if len(choice) ==0:continue
  51. if choice in current_layer:
  52. parent_list.append(current_layer) #进入下一层之前保存当前层
  53. current_layer =current_layer[choice] #将子层赋值给动态字典
  54. elif choice == 'b':
  55. if len(parent_list) !=0:
  56. current_layer =parent_list.pop() #取出列表的最后一个值,并返回这个值
  57. else:print("已经是最后一层")
  58. elif choice =='q':break
  59. else:
  60. print("您所输入的地址不存在,请重输")

  此处实现的方式稍微高级一些,代码量也简洁了不少,而且方法更加巧妙,初学者要理解这里,则需要下很大的功夫。

3,对于多级字典和列表的修改

  当我们将多级列表的内容写入一个空字典,然后在字典中修改内容,我们会发现列表的内容也相应的修改。

  因为我们使用的是同一个内存地址。

  如果说我们想只修改字典中的内容,而让列表中的内容不变,则我们需要copy列表。

  如下:

  1. menu_list = [
  2. {'id': 1, 'title': '菜单1'},
  3. {'id': 2, 'title': '菜单2'},
  4. {'id': 3, 'title': '菜单3'},
  5. ]
  6.  
  7. menu_dict = {}
  8.  
  9. for item in menu_list:
  10. menu_dict[item['id']] = item
  11. # print(item) # {'id': 1, 'title': '菜单1'}
  12. # print(item['id']) # 1
  13. print(menu_dict)
  14.  
  15. # 当我们这样将 menu_list 写入 menu_dict中
  16. # 下面我们修改 mebu_dict中的值,menu_list中的值会发生改变???
  17.  
  18. print(menu_list)
  19. menu_dict[2]['title'] = '修改后的菜单2'
  20. print(menu_list)
  21. '''
  22. [{'id': 1, 'title': '菜单1'}, {'id': 2, 'title': '菜单2'}, {'id': 3, 'title': '菜单3'}]
  23. [{'id': 1, 'title': '菜单1'}, {'id': 2, 'title': '修改后的菜单2'}, {'id': 3, 'title': '菜单3'}]
  24.  
  25. '''

  字典的查找

  1. # 字典的查找
  2. menu_list = [
  3. {'id': 1, 'title': '菜单1'},
  4. {'id': 2, 'title': '菜单2'},
  5. {'id': 3, 'title': '菜单3'},
  6. ]
  7.  
  8. # 请判断:id=2 的值在列表中是否存在?
  9. for item in menu_list:
  10. if item['id'] == 2:
  11. print("id=2 的值在列表中存在")
  12.  
  13. # menu_dict = {}
  14. # for item in menu_list:
  15. # menu_dict[item['id']] = item
  16. # print(menu_dict)
  17.  
  18. menu_dict = {
  19. 1: {'id': 1, 'title': '菜单1'},
  20. 2: {'id': 2, 'title': '菜单2'},
  21. 3: {'id': 3, 'title': '菜单3'}
  22. }
  23. # 请判断:id=2 的值在字典中是否存在?
  24.  
  25. if 2 in menu_dict:
  26. print("id=2 的值在字典中存在")

  但是当我们做如下实验,将一个变量追加到list中,然后修改列表中的变量,我们发现变量是不变的

  1. user = 'james'
  2.  
  3. lis = []
  4. lis.append(user)
  5. print(lis)
  6. lis[0] = 'durant'
  7. print(lis)
  8. print(user)
  9. '''
  10. ['james']
  11. ['durant']
  12. james
  13. '''

  而当我们将字典的内容,放到列表中,也是同理,修改列表中的内容,字典的内容也会发生改变:

  1. dic = {
  2. 'a': ['user1', 'user2'],
  3. 'b': ['user3', 'user4']
  4. }
  5. lis = []
  6.  
  7. for i in dic.values():
  8. lis.append(i)
  9. lis[0][0] = 'user11111111'
  10. print(dic)
  11. # 结果如下:
  12. # {'a': ['user11111111', 'user2'], 'b': ['user3', 'user4']}

  

  所以说,列表,字典,集合都是可变的数据类型。字符串,数字,元组均是不可变的数据类型。

  

二,登录认证程序

2.1 要求:

基础需求:

  1. 让用户输入用户名密码
  2. 认证成功后显示欢迎信息
  3. 输错三次后退出程序

升级需求:

  1. 可以支持多个用户登录 (提示,通过列表存多个账户信息)
  2. 用户3次认证失败后,退出程序
  3. 再次启动程序尝试登录时,还是锁定状态(提示:需把用户锁定的状态存到文件里)

2.2 简单的认证程序

  这种代码可以完成任务,但是代码比较冗余,如果账号密码比较多,就炸了,但是还是实现了简单的认证程序。

  1. vip_username = ['james','wade','park','harden']
  2. vip_password = ['123456','234567','345678','456789']
  3. count = 0
  4.  
  5. while True:
  6. username =input("请输入你的用户名:")
  7. if username not in vip_username:
  8. print("您所输入的用户不存在")
  9. continue
  10. else:
  11. with open("lock_name.txt", 'r+') as userlock:
  12. name_list = userlock.read()
  13. if username in name_list:
  14. print(username + "该用户已经被锁定")
  15. break
  16. password = input("请输入你的密码:")
  17.  
  18. if username==vip_username[0] and password ==vip_password[0]:
  19. print("恭喜"+username+"登陆成功")
  20. break
  21. elif username==vip_username[1] and password ==vip_password[1]:
  22. print("恭喜" + username + "登陆成功")
  23. break
  24. elif username == vip_username[2] and password == vip_password[2]:
  25. print("恭喜" + username + "登陆成功")
  26. break
  27. elif username == vip_username[3] and password == vip_password[3]:
  28. print("恭喜" + username + "登陆成功")
  29. break
  30. else:
  31. count+=1
  32. print('用户密码错误,请你仔细核对')
  33. if count>=3:
  34. with open("lock_name.txt","a") as worryname:
  35. worryname.write(username+","+"\n")
  36. print("输入密码错误次数过多,%s已经被锁定"%username)
  37. break

  

2.3 完善上面的代码

  上面代码有冗余的代码,我们这里修改一下,当然只针对上面代码修改:

  1. username = ['user1', 'user2', 'user3', 'user4']
  2. password = ['121', '122', '123', '124']
  3. count = 0
  4.  
  5. # 为了方便,首先我们将username和password打包在一个字典里面
  6. userinfo = {}
  7. for i in range(len(username)):
  8. userinfo[username[i]] = password[i]
  9. # print(userinfo) # {'user1': '121', 'user2': '122', 'user3': '123', 'user4': '124'}
  10. while True:
  11. inp = input("请输入您的VIP账号名:\n")
  12. if inp not in username:
  13. print("您好,您输入的账号有误,请重新输入")
  14. continue
  15. else:
  16. with open('lock_name.txt', 'r+') as userlock:
  17. name_list = userlock.read()
  18. if inp in name_list:
  19. print(inp + ' : 您已经被被锁定')
  20. break
  21. pwd = input("请输入您的密码:\n")
  22. if pwd == userinfo[inp]:
  23. print("登录成功")
  24. break
  25. else:
  26. print("密码错误,请重新输入")
  27. count += 1
  28. if count >= 3:
  29. with open('lock_name.txt', 'a') as worryname:
  30. worryname.write(username + ',' + '\n')
  31. print("输入密码错误次数过多,%s已经被锁定" % username)
  32. break

  上面代码其实是把Python基础学完后补充的,也算是对这篇博客进行完善吧。

三级菜单的实现(python程序)的更多相关文章

  1. python第四天 三级菜单新思路

    今天是一个坎,在做三级菜单时卡住了,因为想要简洁的代码,就要用到递归函数,卡的不要不要的!不过最后在同学老师的提点帮助下,还是解决了! 2017-5-10发现之前的代码有BUG今天 修改了! 作业要求 ...

  2. Python学习第二天-编写三级菜单

    编写三级菜单:1. 运行程序输出第一级菜单2. 选择一级菜单某项,输出二级菜单,同理输出三级菜单3. 菜单数据保存在文件中4. 让用户选择是否要退出5. 有返回上一级菜单的功能 # Author: z ...

  3. python学习(10)字典学习,写一个三级菜单程序

    学习了字典的应用.按老师的要求写一个三级菜单程序. 三级菜单程序需求如下: 1.深圳市的区--街道--社区---小区4级 2.建立一个字典,把各级区域都装进字典里 3.用户可以从1级进入2级再进入3级 ...

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

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

  5. python 小程序—三级菜单—循环和字典练习

    程序中利用多级字典来存储三级菜单, 通过一系列while循环和for循环,实现了三级菜单的查询,选择,退回上级菜单,退出程序几个功能. 缺点:程序语句过于重复,效率低. #-*-coding:utf- ...

  6. Python初学者第十三天 三级菜单程序小作业

    13day 作业题目: 三级菜单 作业需求: 数据结构: menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村' ...

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

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

  8. python 购物车和三级菜单

    程序:购物车程序 需求: 启动程序后,让用户输入工资,然后打印商品列表 允许用户根据商品编号购买商品 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 可随时退出,退出时,打印已购买商品和余额 ...

  9. python三级菜单的实现

    一.作业要求 1.使用字典实现三级菜单功能 2.直接输入前面数字进入下一级菜单 3.按B返回上一级,按Q退出 二.需要知识点 1.if循环 2.for循环,enumerate的用法 3.while循环 ...

随机推荐

  1. python 如何在一个for循环中遍历两个列表

    是我在看<笨方法学python>过程中发现有一行代码看不懂--" for sentence in snippet, phrase:",所以研究了半天,感觉挺有收获的.所 ...

  2. LxNx前端F2F面试问题整理

    LxNx前端面试问题: 1. 你用过前端哪些框架?它们项目中会用到Angular.js Backbone.js 我回答jQuery, bootstrap, 而Augular.js只是学过 2. 那既然 ...

  3. mysql my.ini配置文件修改无效,修改mysql默认字符集

    问题 开始于 使用mysql命令插入中文数据插不进去 ERROR 1366 (HY000): Incorrect string value: '\xD6\xD0\xCE\xC4' for column ...

  4. Netty SSL安全配置

    Netty SSL安全配置 [TOC] 摘要 在研发蜂鸟部署平台的过程中,涉及到平台网关和前置agent的通信加密,虽然目前软件在内网中,但是由于蜂鸟平台和agent的特殊性,一旦被控制,部署的软件就 ...

  5. 7.28.1 Spring构造注入还是设置注入

    1. 构造方法注入代码如下:public UserManagerImpl(UserDao userDao) {                                              ...

  6. 在fetch方法中添加header后遇到的预检请求问题

    今天在使用fetch方法 fetch('xxx.com',{header:{bbbbbbb:111}}) 浏览器返回的请求信息中,header变成了 :authority:koss.nocorp.me ...

  7. Struts2使用小问题-NoSuchFieldException

    五月 12, 2017 4:55:14 下午 com.opensymphony.xwork2.util.logging.jdk.JdkLogger warn 警告: couldn't clear to ...

  8. shell之 printf 输出语句

    总结: (1)printf 使用引用文本或空格分隔的参数,外面可以在printf中使用格式化字符串,还可以制定字符串的宽度.左右对齐方式等.默认printf不会像 echo 自动添加换行符,我们可以手 ...

  9. 为什么内存使用2G的苹果手机比内存使用4G的安卓机更流畅?

    这是在国外一家网站看到的,分析得不错,原文如下: Why does the iPhone require less RAM than Android devices? There are people ...

  10. 常用的十大Python开发工具

    据权威机构统计,Python人才需求量每日高达5000+,但目前市场上会 Python 的程序员少之又少, 竞争小,很容易快速高薪就业.可能你并不太了解常用的十大Python开发工具都有哪些,现在告诉 ...