• 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 编码部分的学习有点蒙比,有点乱学的,可能需要一段时间在代码上沉浸,才能慢慢感悟这些东西。

     

     

     

     

  • 相关阅读:
    eclipse中的任务标记(TODO、FIXME、XXX)
    编码规范参考
    MVC,MVP 和 MVVM
    Android的两种事件处理机制
    在Eclipse中自定义类似syso的快捷代码模板
    Android
    eclipse使用tips-Toggle Mark Occurrences 颜色更改
    从 Eclipse 迁移至 Android Studio
    Java的位运算符详解实例——与(&)、非(~)、或(|)、异或(^)
    [POJ 2976]Dropping tests(0-1分数规划)
  • 原文地址:https://www.cnblogs.com/jinzejun/p/8444125.html
Copyright © 2020-2023  润新知