zoukankan      html  css  js  c++  java
  • Python 3 学习的第五小节——字符编码与三级菜单实践

    Python 学习的第五小节

     写此博客 是为了激励自己,并且将自己的心得以及遇到的问题与人分享

    一、课堂笔记

      1.字符编码

        二进制

          ---->ASKII:只能存储英文和拉丁字符。一个字符占一个字节,占8位。

          ------>Gb2312:只能存6700多个中文字符,1980

          -------->gbk1.0:存了两万多字符,1995

          ---------->gb18030:27000中文,2000

          

          ------------->unicode:utf-32: 一个字符占4个字节

           ------------->unicode:utf-16:一个字符占2个字节或2个以上,65535

          ------------->unicode:utf-- 8:一个英文用ASKII码来存,一个中文占3个字节

        转成unicode叫做编码,从unicode转成别的语言叫做解码

        GBK能显示的中文,Unicode也能显示。Unicode向下兼容GBK。虽然都能显示中文,但字符编码不一样。(基于Python2来说)

                               

        Python3 :

           所有的字符默认是 Unicode  in Python 3 

           encode 在编码的同时,会把数据转成字节类型(英文数字还是按照ASKII码来,但中文就转成代码了)

           decode 在解码的同时,会把 bytes 类型转成字符串

           b  =  byte  =  字节类型  =  [ 0 - 255 ] 

           Python 3 中的encode 和 Python 2 中的encode不一样

            

     

     

    二、实践学习

    需求:
    打印省、市、县三级菜单。
    可以随时返回上一级。
    可以随时退出程序,不用exit来实现。
    思路:(初步思路)
    通过字典的嵌套来实现三级菜单的构建。
    三级菜单的打印使用了if x=1? 然后进行打印,很麻烦,麻烦到令人发指。
    返回上一级就是从底层while循环退出到上一层while循环。
    随时退出程序暂时没有想法。

    后期思路:
      层层嵌套一定要用到循环来寻找便捷
      
    代码实现:
     1 china = {
     2     '黑龙江':{'佳木斯':['桦川','桦南','汤圆'],
     3              '哈尔滨':['松北','南岗','平房'],
     4              '鸡西':['鸡蛋','鸭蛋','鹅蛋']
     5             },
     6     '吉林':{ '长春':['四平','松原','白城'],
     7             '吉林市':['吉北','吉南','吉东'],
     8             '通化':['东昌','集安','辉南']
     9             },
    10     '广东':{'广州':['海珠','天河','白云'],
    11             '深圳':['福田','罗湖','南山'],
    12             '珠海':['香洲','斗门','金湾']
    13            }
    14 
    15         }
    16 #  重复率很高  代码效率很差
    17 back_flag = False # 为了让程序可以输入b返回上一层循环
    18 exit_flag = False
    19 while not back_flag and not exit_flag:
    20     for key in china:  #遍历china字典中的Keys
    21         print(key)
    22     choice = input("1>>").strip()
    23     if choice == 'b':
    24         back_flag = True
    25     if choice == 'q':  # 输入q退出程序
    26         exit_flag = True
    27     if choice in china: #判断输入的城市在不在菜单当中
    28         while not back_flag and not exit_flag: #这一层循环是为了让即便输入错误仍停留在第二层当中
    29             for key2 in china[choice]:# [choice] 是非常出巧的地方,避免了使用if去进行傻瓜判断 嵌套的非常巧妙
    30                 print(key2)
    31             choice2 = input("2>>").strip()#choice2 是第二次输入的值,也就是市级菜单的值
    32             if choice2 == 'b':
    33                 back_flag = True
    34             if choice2 == 'q':  # 输入q退出程序
    35                 exit_flag = True
    36 
    37             if choice2 in china[choice]:
    38                 while not back_flag and not exit_flag: #也是为了即便输入错误的值仍停留在该层等待
    39                     for key3 in china[choice][choice2]:#这里字典的遍历挺精彩的!!!!!!!
    40                         print(key3)
    41                     choice3 = input("3>>").strip()
    42                     if choice3 == 'b': #输入b返回上一层循环
    43                         back_flag = True
    44                     if choice3 == 'q': # 输入q退出程序
    45                         exit_flag = True
    46 
    47                 else:
    48                     back_flag = False
    49 
    50         else:
    51             back_flag = False

    以上代码为第一次写出来的笨重版本代码,具体笨重在代码循环的方式以及输入变量判断上,很是繁琐。

    之后的代码为改进版本。

     1 china = {
     2     '黑龙江':{'佳木斯':{'桦川','桦南','汤圆'},
     3              '哈尔滨':{'松北','南岗','平房'},
     4              '鸡西':{'鸡蛋','鸭蛋','鹅蛋'}
     5             },
     6     '吉林':{ '长春':{'四平','松原','白城'},
     7             '吉林市':{'吉北','吉南','吉东'},
     8             '通化':{'东昌','集安','辉南'}
     9             },
    10     '广东':{'广州':{'海珠','天河','白云'},
    11             '深圳':{'福田','罗湖','南山'},
    12             '珠海':{'香洲','斗门','金湾'}
    13            }
    14 
    15         }
    16 
    17 exit_flag = False
    18 current_layer = china
    19 
    20 layers = [china]
    21 
    22 while not  exit_flag:
    23     for k in current_layer:
    24         print(k)
    25     choice = input(">>:").strip()
    26     if choice == "b":
    27         current_layer = layers[-1]
    28         #print("change to laster", current_layer)
    29         layers.pop()
    30     elif choice not  in current_layer:continue
    31     else:
    32         layers.append(current_layer)
    33         current_layer = current_layer[choice]

     三、心得

      代码写的还不是很顺手,包括最初那到需求的时候所思考的方式,有点死,所以导致代码量复杂,很多傻瓜代码,然后在Python的编码学习部分学习的不是很透彻,学的很浅薄,主要还是亲手写代码这部分,很欠练。今天的学习更多都是在写这篇代码,其次学习了编码部分。T_T 编码部分的学习有点蒙比,有点乱学的,可能需要一段时间在代码上沉浸,才能慢慢感悟这些东西。

     

     

     

     

  • 相关阅读:
    JID 2.0 RC4 发布,高性能的 Java 序列化库
    FBReaderJ 1.6.3 发布,Android 电子书阅读器
    Arquillian 1.0.3.Final 发布,单元测试框架
    JavaScript 的宏扩展 Sweet.js
    Hypertable 0.9.6.5 发布,分布式数据库
    JRuby 1.7.0 发布,默认使用 Ruby 1.9 模式
    httppp 1.4.0 发布,HTTP响应时间监控
    Redis 2.6.0 正式版发布,高性能K/V服务器
    OfficeFloor 2.5.0 发布,IoC 框架
    XWiki 4.3 首个里程碑发布
  • 原文地址:https://www.cnblogs.com/jinzejun/p/8444125.html
Copyright © 2011-2022 走看看