python 全栈开发,Day6(is,小数据池,编码转换)
一、is
1 2 3 4 | a = 100 b = 100 print (a = = b) print (a is b) |
执行输出:
True
True
查看内存地址,使用id函数
1 2 | print ( id (a)) print ( id (b)) |
执行输出:
2456839554480
2456839554480
内存地址,相当于门牌号
== 比较的是数值
is 比较的是内存地址
二、小数据池
只有数字和字符串类型
小数据池的作用,就是节省内存
数字: -5~256
这个范围指向的是同一内存地址
字符串,是没有范围的。
字符串:
1.如果含有特殊字符,不存在小数据池
2. str(单个) * int int > 20 不存在小数据池
其它的数据类型,不存在小数据池。
三、编码
1 2 3 4 5 6 7 8 9 10 11 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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 '\xe4\xb8\xad\xe5\x9b\xbd' 内部编码:非 unicode . |
str不能直接存储和传输
必须要转换为bytes类型,才可以。
1 2 3 4 | s = 'laonanhai' s1 = b 'laonanhai' print (s) print (s1) |
执行输出:
laonanhai
b'laonanhai'
字符串前面的b表示bytes类型
四、编码转换
字符串转换为bytes
1 2 3 | s = '中国' s1 = s.encode( 'utf-8' ) print (s1) |
执行输出:
b'\xe4\xb8\xad\xe5\x9b\xbd'
一个 \ 表示一位,上面的输出,可以看出占用了6位。
1 2 3 | s = 'alex' s1 = s.encode( 'utf-8' ) print (s1) |
执行输出:
b'alex'
转换为gbk
1 2 3 | s = 'hello girl' s1 = s.encode( 'gbk' ) print (s1) |
执行输出:
b'hello girl'
bytes转换为str
1 2 3 | s1 = b '\xe4\xb8\xad\xe5\x9b\xbd' s2 = s1.decode(encoding = 'utf-8' ) print (s2) |
执行输出:
中国
只有将字符串写入文件或者发送数据时,才需要用到编码转换。
五、考试
考试作业以及答案:
1 2 3 4 5 6 7 8 9 10 11 12 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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 | 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 ( '刚添加的用户名为\t{},密码是\t{}' . 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)
第一种方法(推荐)
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 还是会打印出总和,解决方法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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) |
执行效果如下:
购物车程序,达到的效果如下:
根据老师上次的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | li = [ "手机" , "电脑" , '鼠标垫' , '游艇' ] while True : for i in li: print ( '{}\t{}' . 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 ( '输入的有非数字,请重新输入' ) |
先修改一下执行的输出显示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | goods = [ { "name" : "电脑" , "price" : 1999 }, { "name" : "鼠标" , "price" : 10 }, { "name" : "游艇" , "price" : 20 }, { "name" : "美女" , "price" : 998 }, ] while True : print ( '请选择以下商品' .center( 16 , '*' )) for i in goods: print ( '{}\t{} {}' . 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 ( '输入的有非数字,请重新输入' ) |
执行输出:
增加一个输入框,用来输入资产,在购买商品之前,判断余额是否足够,扣除资产
1 2 3 4 5 6 7 8 9 10 11 12 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 | 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 ( '{}\t{} {}' . 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之后,打印购物车列表
1 2 3 4 5 6 7 8 9 10 11 12 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 | 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 ( '{}\t{} {}' . 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. 可随时退出程序
先准备基础数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | zone = { '山东' : { '青岛' : [ '四方' , '黄岛' , '崂山' , '李沧' , '城阳' ], '济南' : [ '历城' , '槐荫' , '高新' , '长青' , '章丘' ], '烟台' : [ '龙口' , '莱山' , '牟平' , '蓬莱' , '招远' ] }, '江苏' : { '苏州' : [ '沧浪' , '相城' , '平江' , '吴中' , '昆山' ], '南京' : [ '白下' , '秦淮' , '浦口' , '栖霞' , '江宁' ], '无锡' : [ '崇安' , '南长' , '北塘' , '锡山' , '江阴' ] }, '浙江' : { '杭州' : [ '西湖' , '江干' , '下城' , '上城' , '滨江' ], '宁波' : [ '海曙' , '江东' , '江北' , '镇海' , '余姚' ], '温州' : [ '鹿城' , '龙湾' , '乐清' , '瑞安' , '永嘉' ] } } |
以下展示的代码,不包含zone,因为占用行数太多了。
获取省列表
1 | print (zone.keys()) |
执行输出:
dict_keys(['浙江', '山东', '江苏'])
输出的类型是一个特殊类型,没有索引。但是我需要获取索引,怎么办?
把数据转换为列表不就可以了吗?
1 2 3 | #省列表 province = list (zone.keys()) print (province) |
执行输出:
['浙江', '山东', '江苏']
打印省列表,并格式化输出
1 2 3 4 5 6 | #省列表 province = list (zone.keys()) #打印省列表 print ( '省' .center( 20 , '*' )) for i in province: print ( '{}\t{}' . format (province.index(i) + 1 ,i)) |
执行输出:
增加一个输入框,用来输入省编号,这里需要循环输出,用while循环
并且判断输入的内容是否合规
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #省列表 province = list (zone.keys()) #打印省列表 print ( '省' .center( 20 , '*' )) while True : for i in province: print ( '{}\t{}' . 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 ( '输入省编号非法!' ) |
执行输出:
进入市列表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #省列表 province = list (zone.keys()) #打印省列表 print ( '省' .center( 20 , '*' )) while True : for i in province: print ( '{}\t{}' . 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 ( '{}\t{}' . 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 ( '输入省编号非法!' ) |
执行输出:
判断输入的市编号是否合规
1 2 3 4 5 6 7 8 9 10 11 12 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 | #省列表 province = list (zone.keys()) #打印省列表 print ( '省' .center( 20 , '*' )) while True : for i in province: print ( '{}\t{}' . 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 ( '{}\t{}' . 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退出。
1 2 3 4 5 6 7 8 9 10 11 12 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 | #省列表 province = list (zone.keys()) while True : print ( '省' .center( 20 , '*' )) # 打印省列表 for i in province: print ( '{}\t{}' . 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 ( '{}\t{}' . 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 ( '输入省编号非法!' ) |
执行输出:
进入县级,打印县列表,并提示输入框。这里不能再输入数字了,直接提示返回或者退出
1 2 3 4 5 6 7 8 9 10 11 12 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 46 47 48 49 50 | #省列表 province = list (zone.keys()) while True : print ( '省' .center( 20 , '*' )) # 打印省列表 for i in province: print ( '{}\t{}' . 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 ( '{}\t{}' . 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 ( '{}\t{}' . 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。其他的直接提示,已经到底线了。
1 2 3 4 5 6 7 8 9 10 11 12 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 46 47 48 49 50 51 52 53 54 55 56 57 58 | #省列表 province = list (zone.keys()) while True : print ( '省' .center( 20 , '*' )) # 打印省列表 for i in province: print ( '{}\t{}' . 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 ( '{}\t{}' . 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 ( '{}\t{}' . 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 ( '输入省编号非法!' ) |
执行输出:
修改错误提示为红色字体,最终完整代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | zone = { '山东' : { '青岛' : [ '四方' , '黄岛' , '崂山' , '李沧' , '城阳' ], '济南' : [ '历城' , '槐荫' , '高新' , '长青' , '章丘' ], '烟台' : [ '龙口' , '莱山' , '牟平' , '蓬莱' , '招远' ] }, '江苏' : { '苏州' : [ '沧浪' , '相城' , '平江' , '吴中' , '昆山' ], '南京' : [ '白下' , '秦淮' , '浦口' , '栖霞' , '江宁' ], '无锡' : [ '崇安' , '南长' , '北塘' , '锡山' , '江阴' ] }, '浙江' : { '杭州' : [ '西湖' , '江干' , '下城' , '上城' , '滨江' ], '宁波' : [ '海曙' , '江东' , '江北' , '镇海' , '余姚' ], '温州' : [ '鹿城' , '龙湾' , '乐清' , '瑞安' , '永嘉' ] } } #省列表 province = list (zone.keys()) while True : print ( '省' .center( 20 , '*' )) # 打印省列表 for i in province: print ( '{}\t{}' . 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 ( '{}\t{}' . 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 ( '{}\t{}' . 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 ( "\033[41;1m已经到底线了,请返回或者退出!\033[0m" ) else : print ( "\033[41;1m市编号 {} 不存在!\033[0m" . format (city_input)) elif city_input.upper() = = 'B' : break elif city_input.upper() = = 'Q' : #由于在多层while循环里面,直接exit退出即可 exit() else : print ( "\033[41;1m输入市编号非法!\033[0m" ) else : print ( "\033[41;1m省编号 {} 不存在!\033[0m" . format (province_input)) elif province_input.upper() = = 'Q' : break else : print ( "\033[41;1m输入省编号非法!\033[0m" ) |
执行输出:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix