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 : 字母,数字,特殊字符;81个字节表示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分)。
 
Intstr之间如何转化,转换的结果是什么?有没有条件?
 
int 转换为str 结果为str 没有条件限制
str 转换为int 结果为int 要求字符串必须由数字组成
 
Int bool之间如何转化,转换的结果是什么?有没有条件?
 
int --> bool 结果为bool  0True0False  没有条件限制
bool --> int 结果为int True1False0
 
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)
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 还是会打印出总和,解决方法如下:

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")

执行输出:

 

posted @   肖祥  阅读(1355)  评论(2编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· 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
点击右上角即可分享
微信分享提示