• python 全栈开发,Day6(is,小数据池,编码转换)


    一、is

    a = 100
    b = 100
    print(a == b)
    print(a is b)

    执行输出:

    True
    True

    查看内存地址,使用id函数

    print(id(a))
    print(id(b))
    

    执行输出:

    2456839554480
    2456839554480

    内存地址,相当于门牌号

    == 比较的是数值

    is 比较的是内存地址

    二、小数据池

    只有数字和字符串类型

    小数据池的作用,就是节省内存

    数字: -5~256 
    这个范围指向的是同一内存地址
    字符串,是没有范围的。

    字符串:
    1.如果含有特殊字符,不存在小数据池
    2. str(单个) * int int > 20 不存在小数据池

    其它的数据类型,不存在小数据池。

    三、编码

    asiic : 字母,数字,特殊字符;8位 1个字节表示1个字符。
    unicode:万国码:
            Q :0000 0001 0000 0001 0000 0001 0000 0001
            中:0000 0101 0000 0001 0000 0001 0000 0001
    utf-8:
         a:  0000 0001
        欧: 0000 0001 0000 0001
        中: 0000 0001 0000 0001 0000 0001
    gbk:国标
         a: 0000 0001
        中:0000 0001 0000 0001
    

    1.编码之间的二进制户部识别
    2,存储和传输101010,但是不能是unicode的1010101,因为资源浪费了

    数据类型
    int
    bool

    str
    byte 与str的方法相同

    list
    dict

    python3x 中的编码:
        python3x 中 str 在内存中的编码方式是unicode。python3x 中的str不能直接存储,和发送。
        bytes 他的编码方式是非unicode(utf-8,gbk,gb2012.....)。
    
        对于英文:
            str: 表现形式:s = 'laonanhai'
                  内部编码:unicode
            bytes:
                  表现形式:s = b'laonanhai'
                  内部编码:非unicode.
        对于中文:
            str: 表现形式: s = '中国'
                  内部编码:unicode
            bytes:                  00000001
                  表现形式:s1 = b'xe4xb8xadxe5x9bxbd'
                  内部编码:非unicode.
    

    str不能直接存储和传输

    必须要转换为bytes类型,才可以。

    s = 'laonanhai'
    s1 = b'laonanhai'
    print(s)
    print(s1)
    

    执行输出:

    laonanhai
    b'laonanhai'

    字符串前面的b表示bytes类型

    四、编码转换

    字符串转换为bytes

    s = '中国'
    s1 = s.encode('utf-8')
    print(s1)
    

    执行输出:

    b'xe4xb8xadxe5x9bxbd'

    一个 表示一位,上面的输出,可以看出占用了6位。

    s = 'alex'
    s1 = s.encode('utf-8')
    print(s1)
    

    执行输出:

    b'alex'

    转换为gbk

    s = 'hello girl'
    s1 = s.encode('gbk')
    print(s1)
    

    执行输出:

    b'hello girl'

    bytes转换为str

    s1 = b'xe4xb8xadxe5x9bxbd'
    s2 = s1.decode(encoding='utf-8')
    print(s2)

    执行输出:

    中国

    只有将字符串写入文件或者发送数据时,才需要用到编码转换。

    五、考试

    考试作业以及答案:

    Python基础数据类型考试题
    考试时间:两个半小时     满分100分(80分以上包含80分及格)
    一,基础题。
    1,简述变量命名规范(3分)
    
    变量是由数字,字母,下划线,任意组合。
    变量不能以数字开头。
    不能是python中的关键字。
    不能太长,不能是中文,要有描述性。
    官方推荐: 下划线命名法,单词之间用下划线连接。
    
    2,字节和位的关系。(2分)
    
    8 bit = 1 bytes
    
    3,'太白'使用utf-8编码时,占的位数和字节数,是多少?使用gbk编码时,占的位数和字节数,是多少。(2分)
    
    utf-8 占用48位,6字节
    gbk 占用4位,24位
    
    4,默写字符串的十二个功能,并描述其作用。(12分)
    
    capitalize() #首字母大写,其他小写
    upper() #字母全部变成大写
    lower() #字母全部变成小写
    strip() #去除空格,换行,tab键
    split() #分割,将字符串切割成列表
    isdigit() #判断是否是数字
    format() #格式化输出
    replace() #替换
    startswith() #以什么开头
    endswith() #以什么结尾
    center() #居中显示
    count() #统计关键字出现的次数
    
    5,数字,字符串,列表,元祖,字典对应的布尔值的False分别是什么?(5分)
    
    数字,0
    字符串,''
    列表,[]
    元祖,()
    字典,{}
    
    
    6,书写Python2与python3中的三个不同。(3分)
    
    1.源代码风格不一样
    2x 代码混乱
    3x 代码简洁,优美
    
    2.print不同
    2x print 字符串
    3x print('字符串')
    
    3.默认编码不一样
    2x assic
    3x utf-8
    
    7,写代码,有如下列表,利用切片实现每一个功能(每题一分,共计4分)
    li = [1,3,2,'a',4,'b',5,'c']
    1)通过对li列表的切片形成新的列表l3,l3 = ['1,2,4,5]
    
    li3 = li[::2]
    
    2)通过对li列表的切片形成新的列表l4,l4 = [3,'a','b']
    
    li4 = li[1:-2:2]
    
    3)通过对li列表的切片形成新的列表l5,l5 = ['c']
    
    li5 = li[-1].split()
    
    4)通过对li列表的切片形成新的列表l6,l6 = ['b','a',3]
    
    li6 = li[-3::-2]
    
    8,组合嵌套题。
    a,写代码,有如下列表,按照要求实现每一个功能(每题3分,写出一种方法得1分,写出两种方法的3分。此题共9分)
    (每个都是一行代码实现)
    lis = [['k',['qwe',20,{'k1':['tt',3,'1']},89],'ab']]
    1)将列表lis中的'tt'变成大写(用两种方式)。
    
    第一种:
    lis[0][1][2]['k1'][0] = "TT"
    第二种:
    lis[0][1][2]['k1'][0] = lis[0][1][2]['k1'][0].upper()
    
    2)将列表中的数字3变成字符串'100'(用两种方式)。
    
    第一种:
    lis[0][1][2]['k1'][1] = '100'
    第二种:
    lis[0][1][2]['k1'][1] = str(lis[0][1][2]['k1'][1] + 97)
    
    3)将列表中的字符串'1'变成数字101(用两种方式)。
    
    第一种:
    lis[0][1][2]['k1'][2] = 101
    第二种:
    lis[0][1][2]['k1'][2] = int(lis[0][1][2]['k1'][2]+'01')
    
    b,写代码,有如下字典,按照要求实现每一个功能(5分)
    dic = {'k1':'v1','k2':['alex','sb'],(1,2,3,4,5):{'k3':['2',100,'wer']}}
    1)将'k2'对应的值的最后面添加一个元素'23'。
    
    dic['k2'].append('23')
    
    2)将'k2'对应的值的第一个位置插入一个元素'a'。
    
    dic['k2'].insert(0,'a')
    
    3)将(1,2,3,4,5)对应的值添加一个键值对'k4','v4'。
    
    dic[(1,2,3,4,5)]['k4'] = 'v4'
    
    4)将(1,2,3,4,5)对应的值添加一个键值对(1,2,3),'ok'。
    
    dic[(1,2,3,4,5)][(1,2,3)] = 'ok'
    
    5)将'k3'对应的值的'wer'更改为'qq'。
    
    dic[(1,2,3,4,5)]['k3'][2] = 'qq'
    
    9,转化题(4分)。
    
    Int与str之间如何转化,转换的结果是什么?有没有条件?
    
    int 转换为str 结果为str 没有条件限制
    str 转换为int 结果为int 要求字符串必须由数字组成
    
    Int 与 bool之间如何转化,转换的结果是什么?有没有条件?
    
    int --> bool 结果为bool  非0即True,0为False  没有条件限制
    bool --> int 结果为int True为1,False为0
    
    str 与 bool之间如何转化,转换的结果是什么?有没有条件?
    
    str --> bool 结果为true,没有条件限制
    
    str 与 list 能否转化?如何转化?
    
    可以,
    str --> list
    使用split()方法
    list --> str
    使用join()方法
    
    10,实现下列结果(5分)。
    1)有列表li = ['alex','wusir','rain']通过操作该列表构造一个字符串s='alexwusirrain'
    
    s = ''.join(li)
    
    2)有列表li = ['alex','wusir','rain']通过操作该列表构造一个字符串s='alex*wusir*rain'
    
    s = '*'.join(li)
    
    3)有字符串s = 'alexwusirlex',通过操作该字符串构造一个列表li = ['a','exwusirlex']
    
    li = s.split('l')
    
    4)有字符串s = 'alex wusir',通过操作该字符串构造一个列表li = ['alex','wusir']
    
    li = s.split()
    
    5)有字符串s = 'alex'通过操作该字符串构造一个字符串s1 = 'a_l_e_x'
    
    s1 = '_'.join(s)
    
    11,分别使用while循环,和for循环打印1-2+3-4+5.......+99的结果。(10分)
    
    for循环:
    the_sum = 0
    for i in range(1,100):
        #print(i)
        if i % 2 == 1:
            the_sum += i
        else:
            the_sum -= i
    
    print(the_sum)
    
    while循环:
    count = 1
    the_sum = 0
    while count < 100:
        if count % 2 == 1:
            the_sum += count
        else:
            the_sum -= count
        count += 1
    print(the_sum)
    
    12,使用range打印100,99,98,....1,0(2分)
    
    for i in range(100,-1,-1):
        print(i)
    
    13,计算用户输入内容中索引为奇数并且对应的元素为数字的个数(没有则个数为零)(6分)
    
    comment = input("请输入内容:").strip()
    count = 0
    for i in comment:
        # 判断索引是否为奇数,同时索引对应的值是数字
        if comment.index(i) % 2 == 1 and i.isdigit():
            count += 1
    print(count)
    
    14,补充代码(从已有的代码下面继续写):(6分)
    有如下值li= [11,22,33,44,55,77,88,99,90],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。
    li = [11,22,33,44,55,77,88,99,90]
    result = {}
    for row in li:
    ......
    
    li = [11,22,33,44,55,77,88,99,90]
    result = {'k1':[],'k2':[]}
    for row in li:
        if row > 66:
            result['k1'].append(row)
        else:
            result['k2'].append(row)
    
    print(result)
    
    15,查找列表li中的元素,移除每个元素的空格,并找出以'A'或者'a'开头,并以'c'结尾的所有元素,并添加到一个新列表中,最后循环打印这个新列表。(3分)
    li = ['taibai ','alexC','AbC ','egon',' Ritian',' Wusir','  aqc']
    
    li = ['taibai ','alexC','AbC ','egon',' Ritian',' Wusir','  aqc']
    li_new = []
    for i in li:
        i = i.strip()
        if (i.startswith("a") or i.startswith("A")) and i.endswith("c"):
            li_new.append(i)
    
    print(li_new)
    
    16,实现一个整数加法计算器:(3分)
    如:content = input('请输入内容:')  # 如用户输入:5+8+7....(最少输入两个数相加),然后进行分割再进行计算,将最后的计算结果添加到此字典中(替换None):
    dic={'最终计算结果':None}。
    
    content = input('请输入内容:').strip()
    the_sum = 0
    dic = {'最终计算结果': None}
    
    for i in content.split('+'):
        i = i.strip()
        the_sum += int(i)
    
    dic['最终计算结果'] = the_sum
    print(dic)
    
    17,按要求完成下列转化(如果按照索引去做,只能得4分)。(6分)
    list3 = [
        {"name": "alex", "hobby": "抽烟"},
        {"name": "alex", "hobby": "喝酒"},
        {"name": "alex", "hobby": "烫头"},
        {"name": "alex", "hobby": "Massage"},
        {"name": "wusir", "hobby": "喊麦"},
        {"name": "wusir", "hobby": "街舞"},
    ]
    # 如何把上面的列表转换成下方的列表?
    list4 = [
        {"name": "alex", "hobby_list": ["抽烟", "喝酒", "烫头", "Massage"]},
        {"name": "wusir", "hobby_list": ["喊麦", "街舞"]},
    ]
    
    18,写程序:模拟公司hr录入员工账号密码的程序。(10分)
    1),员工的账号密码存储在这种数据类型中:
    user_list = [
        {'username':'barry','password':'1234'},
        {'username':'alex','password':'asdf'},
    	.........
                 ]
    2)非法字符模板:board = ['张三','李小四','王二麻子']
    3)Hr输入用户名,密码(可持续输入,如果想终止程序,那就在输入用户名时输入Q或者q退出程序),在Hr输入用户名时,检测此用户名是否有board里面的非法字符,如果有非法字符,则将非法字符替换成同数量的*(如王二麻子替换成****),然后添加到user_list中,如果没有非法字符,则直接添加到user_list中,每次添加成功后,打印出刚添加的用户名,密码。
    
    user_list = [
        {'username':'barry','password':'1234'},
        {'username':'alex','password':'asdf'}
    ]
    board = ['张三','李小四','王二麻子']
    while True:
    
        user = input('请输入姓名: q/Q退出 ').strip()
        if user.upper() == 'Q': break
        else:
            pwd = input('请输入密码:').strip()
            # 遍历关键词列表
            for j in board:
                if j in user:
                    user = user.replace(j, '*' * len(user_list))
            #添加到字典中
            user_list.append({'username': user, 'password': pwd})
            print('刚添加的用户名为	{},密码是	{}'.format(user, pwd))
    
    Ps:
    
    周末作业。
    写一个购物车,写完了的写三级菜单。
    购物车
    功能要求:
    要求用户输入总资产,例如:2000
    显示商品列表,让用户根据序号选择商品,加入购物车
    购买,如果商品总额大于总资产,提示账户余额不足,否则,购买成功。
    goods = [{"name": "电脑", "price": 1999},
               {"name": "鼠标", "price": 10},
          {"name": "游艇", "price": 20},
          {"name": "美女", "price": 998},
    ]
    
    升级作业:
    程序: 三级菜单
    要求: 
    1.	打印省、市、县三级菜单
    2.	可返回上一级
    3.	可随时退出程序
    

    重点讲解第17题,抽烟,喝酒,烫头

     最low方法

    list3 = [
        {"name": "alex", "hobby": "抽烟"},
        {"name": "alex", "hobby": "喝酒"},
        {"name": "alex", "hobby": "烫头"},
        {"name": "alex", "hobby": "Massage"},
        {"name": "wusir", "hobby": "喊麦"},
        {"name": "wusir", "hobby": "街舞"},
    ]
    list4 = [
        {"name": "alex", "hobby_list": []},
        {"name": "wusir", "hobby_list": []},
    ]
    for i in list3:
        if i['name'] == 'alex':
            list4[0]['hobby_list'].append(i['hobby'])
        else:
            list4[1]['hobby_list'].append(i['hobby'])
    
    print(list4)
    View Code

    第一种方法(推荐)

    dic = {}  # 声明一个空字典
    for i in list3:  # 遍历列表
        if i['name'] not in dic:  # 判断name不在字典里面时
            # 新添加一个key
            dic[i['name']] = {'name':i['name'],'hobby_list':[i['hobby'],]}
            # print(dic)  字典的值就是下面的
            #dic = {'alex':{"name": "alex", "hobby_list": ["抽烟",],
            #        'wusir':{"name": "wusir", "hobby_list": ["喊麦",]}
        else:
            # 如果存在,就添加爱好列表
            dic[i['name']]['hobby_list'].append(i['hobby'])
    
    print(list(dic.values()))

    执行输出:

    [{'hobby_list': ['抽烟', '喝酒', '烫头', 'Massage'], 'name': 'alex'}, {'hobby_list': ['喊麦', '街舞'], 'name': 'wusir'}]

    第二方法,使用setdeafult

    dic={}  # 空字典
    li= []  # 空列表
    for el in list3:
        dic.setdefault(el["name"],[]).append(el['hobby'])
        # 1. 如果有当前name就返回对应列表并且追加新的hobby
        # 2. 如果没有,就返回空列表,追加hobby进去
        # 字典的结果如下:
        # {'alex': ['抽烟', '喝酒', '烫头', 'Massage'], 'wusir': ['喊麦', '街舞']}
    
    for k,v in dic.items():  # 遍历字典
        di = {}    # 将新字典清空后追加到列表,防止每次循环k,v被更新替代
        di["name"]=k  # 设置姓名
        di["hobby_list"]=v  # 设置爱好
        li.append(di)  # 最加到列表中
    
    print(li)

    执行输出,效果同上!

    第16题有一个bug,当输入 1 + ab 还是会打印出总和,解决方法如下:

    dic = {'最终计算结果': None}
    
    while True:
        #总和,必须要放到whlie循环里面,否则会和上次的计算结果相加
        the_sum = 0
        #标志位,必须要放到whlie循环里面,否则无法重置
        flag = True
        #切割加号两边的数字
        content = input('请输入内容:').strip()
        for i in content.split('+'):
            #去除加号2边数字的空格
            i = i.strip()
            #判断是否为数字
            if i.isdigit():
                #自增加
                the_sum += int(i)
            else:
                print("输入 {} 非法!".format(i))
                #如果包含了字母,标志为False
                flag = False
                continue
                
        #判断加号2边的,是否全是数字。
        if flag:
            dic['最终计算结果'] = the_sum
            print(dic)

    执行效果如下:

    购物车程序,达到的效果如下:

    根据老师上次的代码

    li = ["手机", "电脑", '鼠标垫', '游艇']
    while True:
        for i in li:
            print('{}	{}'.format(li.index(i)+1,i))
        num = input('请输入商品序号: q/Q退出:').strip()
        if num.isdigit():
            num = int(num)
            if num > 0 and num <= len(li):
                print(li[num - 1])
            else:
                print('您输入的选项,超出范围,请重新输入')
        elif num.upper() == 'Q':break
        else:
            print('输入的有非数字,请重新输入')
    

    先修改一下执行的输出显示

    goods = [
        {"name": "电脑", "price": 1999},
        {"name": "鼠标", "price": 10},
        {"name": "游艇", "price": 20},
        {"name": "美女", "price": 998},
    ]
    
    while True:
        print('请选择以下商品'.center(16, '*'))
        for i in goods:
            print('{}	{} {}'.format(goods.index(i)+1,i['name'],i['price']))
        num = input('请选择您输入的商品序号(输入Q或者q为退出):').strip()
        if num.isdigit():
            num = int(num)
            if num > 0 and num <= len(goods):
                print('您已经成功购买{}'.format(goods[num - 1]['name']))
            else:
                print('您输入的选项,超出范围,请重新输入')
        elif num.upper() == 'Q':break
        else:
            print('输入的有非数字,请重新输入')
    

    执行输出:

     增加一个输入框,用来输入资产,在购买商品之前,判断余额是否足够,扣除资产

    goods = [
        {"name": "电脑", "price": 1999},
        {"name": "鼠标", "price": 10},
        {"name": "游艇", "price": 20},
        {"name": "美女", "price": 998},
    ]
    
    # 总资产
    while True:
        assets = input('请输入你的总资产:').strip()
        if assets.isdigit():
            assets = int(assets)
            break
        else:
            print('您输入是非数字,请重新输入')
    
    while True:
        print('请选择以下商品'.center(16, '*'))
        # 打印商品列表
        for i in goods:
            print('{}	{} {}'.format(goods.index(i) + 1, i['name'], i['price']))
        num = input('请选择您输入的商品序号(输入Q或者q为退出):').strip()
        if num.isdigit():
            num = int(num)
            if num > 0 and num <= len(goods):
                # 判断当前余额是否大于商品价格
                if assets >= goods[num - 1]['price']:
                    # 扣除商品价格后为当前余额
                    assets -= goods[num - 1]['price']
                else:
                    print('当前余额不足,无法购买此商品!')
    
            else:
                print('您输入的选项,超出范围,请重新输入')
        elif num.upper() == 'Q':
            break
        else:
            print('输入的有非数字,请重新输入')
    

    执行输出:

    加入购物车列表,输入q之后,打印购物车列表

    goods = [
        {"name": "电脑", "price": 1999},
        {"name": "鼠标", "price": 10},
        {"name": "游艇", "price": 20},
        {"name": "美女", "price": 998},
    ]
    #购物车列表
    shopping_cart = []
    # 总资产
    while True:
        assets = input('请输入你的总资产:').strip()
        if assets.isdigit():
            assets = int(assets)
            break
        else:
            print('您输入是非数字,请重新输入')
    
    while True:
        print('请选择以下商品'.center(16, '*'))
        #打印商品列表
        for i in goods:
            print('{}	{} {}'.format(goods.index(i)+1,i['name'],i['price']))
        num = input('请选择您输入的商品序号(输入Q或者q为退出):').strip()
        if num.isdigit():
            num = int(num)
            if num > 0 and num <= len(goods):
                #判断当前余额是否大于商品价格
                if assets >= goods[num - 1]['price']:
                    # 扣除商品价格后为当前余额
                    assets -= goods[num - 1]['price']
                    # 加入购物车列表
                    shopping_cart.append({'name': goods[num - 1]['name'], 'price': goods[num - 1]['price']})
                    print('您已经成功购买{},您的余额是{}'.format(goods[num - 1]['name'], assets))
                else:
                    print('当前余额不足,无法购买此商品!')
            else:
                print('您输入的选项,超出范围,请重新输入')
        elif num.upper() == 'Q':
            print('您已经购买了如下商品')
            for i in shopping_cart:
                print(i)
            break
        else:
            print('输入的有非数字,请重新输入')

    执行输出:

    程序: 三级菜单
    要求:
    1. 打印省、市、县三级菜单
    2. 可返回上一级
    3. 可随时退出程序

    先准备基础数据

    zone = {
        '山东' : {
            '青岛' : ['四方','黄岛','崂山','李沧','城阳'],
            '济南' : ['历城','槐荫','高新','长青','章丘'],
            '烟台' : ['龙口','莱山','牟平','蓬莱','招远']
        },
        '江苏' : {
            '苏州' : ['沧浪','相城','平江','吴中','昆山'],
            '南京' : ['白下','秦淮','浦口','栖霞','江宁'],
            '无锡' : ['崇安','南长','北塘','锡山','江阴']
        },
        '浙江' : {
            '杭州' : ['西湖','江干','下城','上城','滨江'],
            '宁波' : ['海曙','江东','江北','镇海','余姚'],
            '温州' : ['鹿城','龙湾','乐清','瑞安','永嘉']
        }
    }
    

    以下展示的代码,不包含zone,因为占用行数太多了。

    获取省列表

    print(zone.keys())
    

    执行输出:

    dict_keys(['浙江', '山东', '江苏'])

    输出的类型是一个特殊类型,没有索引。但是我需要获取索引,怎么办?

    把数据转换为列表不就可以了吗?

    #省列表
    province = list(zone.keys())
    print(province)
    

    执行输出:

    ['浙江', '山东', '江苏']

    打印省列表,并格式化输出

    #省列表
    province = list(zone.keys())
    #打印省列表
    print('省'.center(20,'*'))
    for i in province:
        print('{}	{}'.format(province.index(i)+1,i))
    

    执行输出:

     增加一个输入框,用来输入省编号,这里需要循环输出,用while循环

     并且判断输入的内容是否合规

    #省列表
    province = list(zone.keys())
    #打印省列表
    print('省'.center(20,'*'))
    while True:
        for i in province:
            print('{}	{}'.format(province.index(i)+1,i))
        province_input = input('请输入省编号,或输入q/Q退出:').strip()
        if province_input.isdigit():
            province_input = int(province_input)
            if province_input > 0 and province_input <= len(province):
                pass
            else:
                print('省编号 {} 不存在!'.format(province_input))
        elif province_input.upper() == 'Q':
            break
        else:
            print('输入省编号非法!')

    执行输出:

     进入市列表

    #省列表
    province = list(zone.keys())
    #打印省列表
    print('省'.center(20,'*'))
    while True:
        for i in province:
            print('{}	{}'.format(province.index(i)+1,i))
        province_input = input('请输入省编号,或输入q/Q退出:').strip()
        if province_input.isdigit():
            province_input = int(province_input)
            if province_input > 0 and province_input <= len(province):
                #省编号,由于显示加1,获取的时候,需要减1
                province_id = province_input - 1
                #城市列表
                city = list(zone[province[province_id]].keys())
                #进入市区列表
                while True:
                    print('市'.center(20, '*'))
                    for j in city:
                        print('{}	{}'.format(city.index(j) + 1, j))
                    city_input = input("请输入市编号,或输入b(back)返回上级菜单,或输入q(quit)退出:").strip()
                #退出省循环
                break
            else:
                print('省编号 {} 不存在!'.format(province_input))
        elif province_input.upper() == 'Q':
            break
        else:
            print('输入省编号非法!')

    执行输出:

    判断输入的市编号是否合规

    #省列表
    province = list(zone.keys())
    #打印省列表
    print('省'.center(20,'*'))
    while True:
        for i in province:
            print('{}	{}'.format(province.index(i)+1,i))
        province_input = input('请输入省编号,或输入q/Q退出:').strip()
        if province_input.isdigit():
            province_input = int(province_input)
            if province_input > 0 and province_input <= len(province):
                #省编号,由于显示加1,获取的时候,需要减1
                province_id = province_input - 1
                #城市列表
                city = list(zone[province[province_id]].keys())
                #进入市区列表
                while True:
                    print('市'.center(20, '*'))
                    for j in city:
                        print('{}	{}'.format(city.index(j) + 1, j))
                    city_input = input("请输入市编号,或输入b(back)返回上级菜单,或输入q(quit)退出:").strip()
                    if city_input.isdigit():
                        city_input = int(city_input)
                        if city_input > 0 and city_input <= len(city):
                            pass
                        else:
                            print('市编号 {} 不存在!'.format(city_input))
                    else:
                        print('输入市编号非法!')
    
                #退出省循环
                break
            else:
                print('省编号 {} 不存在!'.format(province_input))
        elif province_input.upper() == 'Q':
            break
        else:
            print('输入省编号非法!')
    

    执行输出:

    完成输入b返回上一级菜单功能

    这里需要调整一下输出省列表的位置,删除多余的breck。还有输入q退出。

    #省列表
    province = list(zone.keys())
    while True:
        print('省'.center(20, '*'))
        # 打印省列表
        for i in province:
            print('{}	{}'.format(province.index(i)+1,i))
        province_input = input('请输入省编号,或输入q/Q退出:').strip()
        if province_input.isdigit():
            province_input = int(province_input)
            if province_input > 0 and province_input <= len(province):
                #省编号,由于显示加1,获取的时候,需要减1
                province_id = province_input - 1
                #城市列表
                city = list(zone[province[province_id]].keys())
                #进入市区列表
                while True:
                    print('市'.center(20, '*'))
                    for j in city:
                        print('{}	{}'.format(city.index(j) + 1, j))
                    city_input = input("请输入市编号,或输入b(back)返回上级菜单,或输入q(quit)退出:").strip()
                    if city_input.isdigit():
                        city_input = int(city_input)
                        if city_input > 0 and city_input <= len(city):
                            pass
                        else:
                            print('市编号 {} 不存在!'.format(city_input))
                    elif city_input.upper() == 'B':
                        break
                    elif city_input.upper() == 'Q':
                        #由于在多层while循环里面,直接exit退出即可
                        exit()
                    else:
                        print('输入市编号非法!')
            else:
                print('省编号 {} 不存在!'.format(province_input))
        elif province_input.upper() == 'Q':
            break
        else:
            print('输入省编号非法!')

    执行输出:

     

     进入县级,打印县列表,并提示输入框。这里不能再输入数字了,直接提示返回或者退出

    #省列表
    province = list(zone.keys())
    while True:
        print('省'.center(20, '*'))
        # 打印省列表
        for i in province:
            print('{}	{}'.format(province.index(i)+1,i))
        province_input = input('请输入省编号,或输入q/Q退出:').strip()
        if province_input.isdigit():
            province_input = int(province_input)
            if province_input > 0 and province_input <= len(province):
                #省编号,由于显示加1,获取的时候,需要减1
                province_id = province_input - 1
                #城市列表
                city = list(zone[province[province_id]].keys())
                #进入市区列表
                while True:
                    print('市'.center(20, '*'))
                    for j in city:
                        print('{}	{}'.format(city.index(j) + 1, j))
                    city_input = input("请输入市编号,或输入b(back)返回上级菜单,或输入q(quit)退出:").strip()
                    if city_input.isdigit():
                        city_input = int(city_input)
                        if city_input > 0 and city_input <= len(city):
                            # 市编号,由于显示加1,获取的时候,需要减1
                            city_id = city_input - 1
                            #县列表
                            county = zone[province[province_id]][city[city_id]]
                            # 县列表
                            while True:
                                print('县'.center(20, '*'))
                                for k in county:
                                    print('{}	{}'.format(county.index(k) + 1, k))
                                #到县这一级,不能输入编号了,直接提示返回菜单或者退出
                                county_input = input("输入b(back)返回上级菜单,或输入q(quit)退出:").strip()
                        else:
                            print('市编号 {} 不存在!'.format(city_input))
                    elif city_input.upper() == 'B':
                        break
                    elif city_input.upper() == 'Q':
                        #由于在多层while循环里面,直接exit退出即可
                        exit()
                    else:
                        print('输入市编号非法!')
            else:
                print('省编号 {} 不存在!'.format(province_input))
        elif province_input.upper() == 'Q':
            break
        else:
            print('输入省编号非法!')
    

    执行输出:

     判断县输入的内容。这里直接判断是否输入的是b或者q。其他的直接提示,已经到底线了。

    #省列表
    province = list(zone.keys())
    while True:
        print('省'.center(20, '*'))
        # 打印省列表
        for i in province:
            print('{}	{}'.format(province.index(i)+1,i))
        province_input = input('请输入省编号,或输入q/Q退出:').strip()
        if province_input.isdigit():
            province_input = int(province_input)
            if province_input > 0 and province_input <= len(province):
                #省编号,由于显示加1,获取的时候,需要减1
                province_id = province_input - 1
                #城市列表
                city = list(zone[province[province_id]].keys())
                #进入市区列表
                while True:
                    print('市'.center(20, '*'))
                    for j in city:
                        print('{}	{}'.format(city.index(j) + 1, j))
                    city_input = input("请输入市编号,或输入b(back)返回上级菜单,或输入q(quit)退出:").strip()
                    if city_input.isdigit():
                        city_input = int(city_input)
                        if city_input > 0 and city_input <= len(city):
                            # 市编号,由于显示加1,获取的时候,需要减1
                            city_id = city_input - 1
                            #县列表
                            county = zone[province[province_id]][city[city_id]]
                            # 县列表
                            while True:
                                print('县'.center(20, '*'))
                                for k in county:
                                    print('{}	{}'.format(county.index(k) + 1, k))
                                #到县这一级,不能输入编号了,直接提示返回菜单或者退出
                                county_input = input("输入b(back)返回上级菜单,或输入q(quit)退出:").strip()
                                if county_input == 'b':
                                    # 终止此层while循环,跳转到上一层While
                                    break
                                elif county_input == 'q':
                                    # 结束程序
                                    exit()
                                else:
                                    print("已经到底线了,请返回或者退出!")
                        else:
                            print('市编号 {} 不存在!'.format(city_input))
                    elif city_input.upper() == 'B':
                        break
                    elif city_input.upper() == 'Q':
                        #由于在多层while循环里面,直接exit退出即可
                        exit()
                    else:
                        print('输入市编号非法!')
            else:
                print('省编号 {} 不存在!'.format(province_input))
        elif province_input.upper() == 'Q':
            break
        else:
            print('输入省编号非法!')
    

    执行输出:

     修改错误提示为红色字体,最终完整代码如下:

    zone = {
        '山东' : {
            '青岛' : ['四方','黄岛','崂山','李沧','城阳'],
            '济南' : ['历城','槐荫','高新','长青','章丘'],
            '烟台' : ['龙口','莱山','牟平','蓬莱','招远']
        },
        '江苏' : {
            '苏州' : ['沧浪','相城','平江','吴中','昆山'],
            '南京' : ['白下','秦淮','浦口','栖霞','江宁'],
            '无锡' : ['崇安','南长','北塘','锡山','江阴']
        },
        '浙江' : {
            '杭州' : ['西湖','江干','下城','上城','滨江'],
            '宁波' : ['海曙','江东','江北','镇海','余姚'],
            '温州' : ['鹿城','龙湾','乐清','瑞安','永嘉']
        }
    }
    #省列表
    province = list(zone.keys())
    while True:
        print('省'.center(20, '*'))
        # 打印省列表
        for i in province:
            print('{}	{}'.format(province.index(i)+1,i))
        province_input = input('请输入省编号,或输入q/Q退出:').strip()
        if province_input.isdigit():
            province_input = int(province_input)
            if province_input > 0 and province_input <= len(province):
                #省编号,由于显示加1,获取的时候,需要减1
                province_id = province_input - 1
                #城市列表
                city = list(zone[province[province_id]].keys())
                #进入市区列表
                while True:
                    print('市'.center(20, '*'))
                    for j in city:
                        print('{}	{}'.format(city.index(j) + 1, j))
                    city_input = input("请输入市编号,或输入b(back)返回上级菜单,或输入q(quit)退出:").strip()
                    if city_input.isdigit():
                        city_input = int(city_input)
                        if city_input > 0 and city_input <= len(city):
                            # 市编号,由于显示加1,获取的时候,需要减1
                            city_id = city_input - 1
                            #县列表
                            county = zone[province[province_id]][city[city_id]]
                            # 县列表
                            while True:
                                print('县'.center(20, '*'))
                                for k in county:
                                    print('{}	{}'.format(county.index(k) + 1, k))
                                #到县这一级,不能输入编号了,直接提示返回菜单或者退出
                                county_input = input("输入b(back)返回上级菜单,或输入q(quit)退出:").strip()
                                if county_input == 'b':
                                    # 终止此层while循环,跳转到上一层While
                                    break
                                elif county_input == 'q':
                                    # 结束程序
                                    exit()
                                else:
                                    print("33[41;1m已经到底线了,请返回或者退出!33[0m")
                        else:
                            print("33[41;1m市编号 {} 不存在!33[0m".format(city_input))
                    elif city_input.upper() == 'B':
                        break
                    elif city_input.upper() == 'Q':
                        #由于在多层while循环里面,直接exit退出即可
                        exit()
                    else:
                        print("33[41;1m输入市编号非法!33[0m")
            else:
                print("33[41;1m省编号 {} 不存在!33[0m".format(province_input))
        elif province_input.upper() == 'Q':
            break
        else:
            print("33[41;1m输入省编号非法!33[0m")
    

    执行输出:

  • 相关阅读:
    深入理解linux启动过程
    Oracle 12c 的新功能:模式匹配查询
    AIX 常用命令汇总
    Oracle 11g ADRCI工具使用
    AIX TL的升级和回退
    oracle redo log的维护
    202. Happy Number
    198. House Robber
    203. Remove Linked List Elements
    217. Contains Duplicate
  • 原文地址:https://www.cnblogs.com/xiao987334176/p/8633859.html
Copyright © 2020-2023  润新知