Python可以应用于众多领域,如:数据分析、组件集成、网络服务、图像处理、数值计算和科学计算等众多领域。目前业内几乎所有大中型互联网企业都在使用Python,如:Youtube、Dropbox、BT、Quora(中国知乎)、豆瓣、知乎、Google、Yahoo!、Facebook、NASA、百度、腾讯、汽车之家、美团等
目前Python主要应用领域:
cpu:
相当于人的大脑,运算与控制中心。速度飞机内存:暂
时存储,供给CPU数据。速度高铁。成本高,断电即消失。硬盘:
相当于电脑的数据库,存储着大量的数据,文件,音频文件。速度走。成本低操作系统:
执行者,支配所有关系。windows,linux,mac...
python流行的原因1.大量第三方库2.Diango
Python崇尚优美、清晰、简单,是一个优秀并广泛使用的语言。python2x和3x在同一年诞生,2x是10月,3是12月python2x:源码混乱,重复代码较多,冗余。python3x:源码规范,崇尚优美、清晰,简单
1.print方法有区别python3xprint('内容')python2xprint()或者print'内容'
2.编码方式不一样python3x默认编码:utf-8python2x默认编码:ascii只包含英文字母和特殊字符以及数字不支持中文解决方式:在头部增加
#-*-coding:utf-8-*-3.input不同python2x:raw_input()python3x:input()
编程语言主要从以下几个角度进行分类,编译型和解释型、静态语言和动态语言、强类型定义语言和弱类型定义语,我们先看编译型语言和解释型语言.稍后再说强类型和弱类型
解释型:当程序运行时,将代码一行一行的解释成二进制,再运行。优点:排错快,开发效率高,可以跨平台.有良好的平台兼容性,在任何环境中都可以运行,前提是安装了了解释器(虚拟机)。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护。
缺点:执行效率相对低,每次运行的时候都要解释一遍,性能上不如编译性语言典型:python,javascrip,php编译型:将代码一次性全部编译成二进制,然后运行。所以执行效率高,可以脱离语言环境独立运行。缺点:排错慢,开发效率低,不能跨平台(操作系统)。编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运环境成机器码,不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执件。
优点:执行效率高典型:C,c++,go
这是因为计算机不能直接认识并执行我们写的语句,它只能认识机器语(是二进制的形式)
python的种类
CPython默认解释器,转换为字节码,再转换为c语言010101...IPythonPyPy一次性全部转化成二进制,执行效率高。Jython把Python代码编译成Java字节码执行IronPython
虽然解释器不同,但是写python代码的规则还是统一的。
如果想要windows电脑同时有2个python环境,Python2.7和Python3.5
先安装python2.7
勾选添加环境变量
再安装python3.5
选择自定义安装,勾选添加环境变量
安装路径设置为C:\Python35
进入目录C:\Python27
将python.exe更改为python2.exe
打开windows命令行模式
输入python2就是2.7版本
输入python就是3.5版本
新建一个test.py文件,内容如下
print('你好,世界')使用命令行方式
我的代码路径在E:\python_script\day1
进入目录,执行代码
使用python2执行
执行报错
因为默认python2x编码是ascii,不支持中文
在第一行添加
#-*-coding:utf-8-*-
再次执行,就可以了
如果python安装完成之后,发现执行python有问题时可以把所有python版本卸载,重新安装一次,确保环境变量已经删除,文件后缀是可以显示的。
变量:把程序运行的中间结果临时的存在内存里,以便后续的代码调用。
变量定义的规则:
1,变量必须由数字,字母,下划线任意组合。2,变量不能以数字开头。3,变量不能是python中的关键字。(不用背)['and','as','assert','break','class','continue','def','del','elif','else','except','exec','finally','for','from','global','if','import','in','is','lambda','not','or','pass','print','raise','return','try','while','with','yield']4,变量要具有可描述性。5,变量不能是中文。6,变量不能太长。7,官方推荐:
#驼峰体AgeOfOldboy=56NumberOfStudents=100#下划线age_of_oldboy=56number_of_students=80
一般推荐使用第2种,也就是下划线的方式。
下面几个例子,判断变量名是否合法
w__=22e_a_='太白'e$='fdsa'-_='15'2g=33__='老村长'3,4,5行的变量,是不合法的,其他的都是合法的。
赋值计算先计算等号右边的,把计算的值赋值给左边的
python是解释型语言,代码是一行一行执行后面的变量会覆盖前面的。
age1=12age2=age1age3=age2age2=6print(age1,age2,age3)执行输出
12612
看一个图
age1~3的值,存储在内存中。当age2等于6时,age2值的指向就发生了变化,值为6
7.常量常量即指不变的量,如pai3.141592653...,或在程序运行过程中不会改变的量默认全部大写的变量,称之为常量。
CITY_LIST='beijing'
11.注释为什么有注释?帮助你记起之前的代码,或者帮助别人看懂你的代码不宜多,精就行
单行注释:#被注释内容多行注释:'''被注释内容'''或者"""被注释内容"""
#定义一个变量name1="taibai"'''虞美人·碧苔深锁长门路清代:王国维碧苔深锁长门路。总为蛾眉误。自来积毁骨能销。何况真红一点臂砂娇。妾身但使分明在。肯把朱颜悔。从今不复梦承恩。且自簪花坐赏镜中人。'''
int(整型)
在32位机器上,整数的位数为32位,取值范围为-2**31~2**31-1,即-2147483648~2147483647
在64位系统上,整数的位数为64位,取值范围为-2**63~2**63-1,即-9223372036854775808~9223372036854775807
long(长整型)
跟C语言不同,Python的长整数没有指定位宽,即:Python没有限制长整数数值的大小,但实际上由于机器内存有限,我们使用的长整数数值不可能无限大。
注意,自从Python2.2起,如果整数发生溢出,Python会自动将整数数据转换为长整数,所以如今在长整数数据后面不加字母L也不会导致严重后果了。注意:在Python3里不再有long类型了,全都是int长整型
字符串类型(str)
在Python中,加了引号的字符都被认为是字符串!
msg="Mynameisxiao,I'm22yearsold!"num='12'这种会出错
msg="Mynameisxiao,I"m22"yearsold!"双引号,只看2头的,从左到右
一般3个引号的,用到多行的场景,有行号符的。一行很少用3个引号的
shi='''马汗踏成泥,朝驰几万蹄。雪中行地角,火处宿天倪。塞迥心常怯,乡遥梦亦迷。那知故园月,也到铁关西。'''print(shi)执行输出
马汗踏成泥,朝驰几万蹄。雪中行地角,火处宿天倪。塞迥心常怯,乡遥梦亦迷。那知故园月,也到铁关西。
3个单引号,没有赋值,是用来注释的
比如上面的唐诗《虞美人·碧苔深锁长门路》
字符串只能相加和相乘
相加
n1='她的名字是'n2='南宫紫菱'n3=n1+n2print(n3)执行输出
她的名字是南宫紫菱
相乘
n1='我好爱你!'print(n1*3)执行输出
我好爱你!我好爱你!我好爱你!
布尔类型很简单,就两个值,一个True(真),一个False(假),主要用记逻辑判断
print(1>2)执行输出
False
返回false布尔值是不带引号的
print(1>2and3<4or4>5)执行输出
布尔值判断时,如果出现false,结果返回false
使用type()方法
n1='nan'n2=Falsen3='False'print(type(n1))print(type(n2))print(type(n3))执行输出
input出来的数据类型,都是字符串
name=input('请输入你的名字:')age=input('请输入你的年龄:')hobby=input('请输入你的爱好:')s='我的名字是'+name+'\n我的年龄是'+age+'\n我的爱好是'+hobbyprint(s)执行效果
第一种结构
if条件:结果举例
if3>2:print(666)执行输出
666
第二种结构
if条件:结果else:结果举例
if3>2:print(666)else:print(333)执行输出
第三种结构
if条件1:结果1elif条件2:结果2elif条件3:结果3举例
choice=input('请输入你猜的数字:')ifchoice=='2':print('我请你吃饭')elifchoice=='6':print('免一周作业')elifchoice=='3':print('一起去玩耍')执行输出
第4种结构
if条件1:结果1elif条件2:结果2elif条件3:结果3else:结果4举例
choice=input('请输入你猜的数字:')ifchoice=='2':print('我请你吃饭')elifchoice=='6':print('免一周作业')elifchoice=='3':print('一起去玩耍')else:print('输入错误')执行输出
==表示做比较=表示赋值
第5种结构
if条件:if条件:结果else:结果else:结果只要需求存在,就可以一直嵌套if
举例
age=int(input('请猜我的年龄:'))ifTrue:ifage==18:print('恭喜你猜对了')else:print('这都看不出来...')else:print('输入错误')执行输出
字符串之间不能比较大小,只能比较相等
int--->strstr(12)转换成字符串,使用str()str--->intint(12)全部由数字组成的字符串才能转化为数字
用来执行重复的代码
whileTrue:print('痒')print('凉凉')print('体面')print('社会摇')执行输出
痒凉凉体面社会摇
...
whileTrue代表死循环
另外一个例子
print(222)whileTrue:print(111)print(333)print(444)执行输出
222
111333
....
444永远不会执行
跳出循环的条件:1.改变条件2.breck
标志位flag
从1打印到100
#标志位flag=True#初始值count=1whileflag:#第一次,打印初始值。之后打印自增值print(count)#循环一次,自增1count=count+1#当等于100时,循环终止ifcount==100:#打印100print(count)flag=False执行输出
1
2
3
100
第2种写法
#初始值count=1whilecount<101:#第一次,打印初始值。之后打印自增值print(count)#循环一次,自增1count=count+1执行输出,效果同上
breck:结束循环
whileTrue:print(111)print(222)breakprint(333)执行输出
111
遇到breck,终止循环,下面的代码不执行
continue:结束本次循环,继续下一次循环。continue相当于见底了
whileTrue:print(111)print(222)continueprint(333)执行输出
333永远不会执行,为什么呢?遇到continue时,下面代码不执行,继续执行下一次循环,由于循环无法终止,所以最后一行代码,始终不会执行。
使用breck方式,打印1到100
#初始值count=1whileTrue:#第一次,打印初始值。之后打印自增值print(count)#循环一次,自增1count=count+1ifcount==101:break执行输出1到100执行输出1到100
1、使用while循环输入1234568910
2、求1-100的所有数的和
3、输出1-100内的所有奇数
4、输出1-100内的所有偶数
5、求1-2+3-4+5...99的所有数的和
6、用户登陆(三次机会重试)
习题分析:
观察题目,发现1~10,少了一个数字7
思路如下:
1.先输出1~10
#初始值count=0whilecount<10:count=count+1print(count)执行输出1~10
2.遇到7的时候,不执行print()就可以了
如果直接用breck,那么循环就终止了。这个时候,需要用到continue了
最终代码如下:
#初始值count=0whilecount<10:#自增1count=count+1#判断为7时,终止此次循环,继续下一次循环ifcount==7:continueprint(count)执行输出
1234568910
思路如下:
1.先输出1~100
#初始值count=0whilecount<100:#自增1count=count+1print(count)2.需要定义一个总和变量the_sum,每次要向前推进加数字,就比如吃豆游戏一样
#初始值count=0#总和的初始值the_sum=0whilecount<100:#自增1count=count+1the_sum=the_sum+countprint(the_sum)print(the_sum)执行输出
136
5050
上面的代码,我把每次相加的结果给打印出来了。
0+1+2+3+....+100
计算过程是从左至右的,0+1=1,再计算1+2=3,再计算3+3=6....
解释一下代码执行过程
第一次count=0,the_sum=0执行到第7行时,count=1,那么the_sum结果1,所以输出1
第二次count=1(因为whlie循环会迭代),执行到第7行时,count=2(1+1=2),那么the_sum的结果为3。因为第一次the_sum的值为1,所以这里为1+2=3
第三次,count=2,执行到第7行时,count=3,那么the_sum的结果为6(3+3=6)
所以最终结果为4950+100=5050
先来介绍求奇数和偶数的方法
用数字和2整除,取余%等于1为奇数等于0为偶数
思路和第2题类似
#初始值count=0whilecount<100:#自增1count=count+1print(count)执行输出1~100
2.用count和2整除取余,如果为1,输出数字,否则不输出
#初始值count=0whilecount<100:#自增1count=count+1#取余,和2整除yushu=count%2#为1表示奇数ifyushu==1:print(count)执行输出
135
99
方法和第3题类似,把取余部分修改一下
#初始值count=0whilecount<100:#自增1count=count+1#取余,和2整除yushu=count%2#为0表示偶数ifyushu==0:print(count)执行输出
246
从这个公式可以发现出规律
为偶数的是做减法
为奇数的是做加法
思路:
在第二个题目基础上来做,第二个是1到100的求和
1.先把第2题的代码贴过来
2.在此基础上做一下稍微的改动,最终代码如下:
#初始值count=0#计算最终值的初始值final_value=0whilecount<99:#自增1count=count+1#取余,和2整除yushu=count%2#为1表示奇数ifyushu==1:#做加法运算final_value=final_value+countprint(final_value)#偶数else:#做减法运算final_value=final_value-countprint(final_value)print(final_value)执行输出
1-12
50
最终结果为50
注意:这里最后一个数字是99,而不是100,所以是whilecount<99
上面的代码,我把每次计算的结果给打印出来了。
0+1-2+3-4....+99
计算过程是从左至右的,0+1=1,再计算1-2=-1,再计算-1+3=2....
第一次count=0,final_value=0,执行到第7行时,count=1。做取余计算1/2,结果为1。
if判断等于1,结果成立,所以为奇数。计算等式final_value+count也就是0+1=1,输出1
第二次count=1,final_value=1,执行到第7行时,count=2。做取余计算2/2,结果为0。
if判断等于1,结果不成立,所以为偶数。计算等式final_value-count也就是1-2=-1,输出-1
第三次count=2,final_value=-1,执行到第7行时,count=3。做取余计算3/2,结果为1。
if判断等于1,结果成立,所以为奇数。计算等式final_value+count也就是-1+3=2,输出2
所以最终结果为-49+99=50
6、用户登陆(三次机会重试)思路
a=100b=100print(a==b)print(aisb)执行输出:
TrueTrue
#列表#li=[1,2,3]#li2=[1,2,3]#print(liisli2)#False#元组#tu=(1,2,3)#tu1=(1,2,3)#print(tuistu1)#False#字典#dic1={'name':'alex'}#dic={'name':'alex'}#print(dic1isdic)#False两个相同的字典{},列表[],元组()都是False
查看内存地址,使用id函数
print(id(a))print(id(b))执行输出:
24568395544802456839554480
#a='alex'#print(id(a))#36942544内存地址#n=10#print(id(n))#1408197120#li=[1,2,3]#print(id(li))#38922760内存地址,相当于门牌号
==比较的是数值
is比较的是内存地址内存地址用id()获取
只有数字和字符串类型
小数据池的作用:就是节省内存
数字小数据池:-5~256这个范围指向的是同一内存地址
n=-6n1=-6print(nisn1)#Falsen=-5n1=-5print(nisn1)#Truen=257n1=257print(nisn1)#True字符串,是没有范围的。
a='alex@'a1='alex@'print(aisa1)在pycharm上是True在cmd上是False
字符串:1.如果含有特殊字符,不存在小数据池
2.str(单个)*intint>20不存在小数据池(字符串中单个*20以内他们的内存地址一样,单个*21以上内存地址不一致)
#n=5//2#n1=2#print(nisn1)#True
#a='a'*21#b='a'*21#print(aisb)#False
a='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'b='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'print(aisb)#True
其它的数据类型,不存在小数据池。
asiic:字母,数字,特殊字符;8位1个字节表示1个字符。unicode:万国码:Q:00000001000000010000000100000001中:00000101000000010000000100000001utf-8:a:00000001欧:0000000100000001中:000000010000000100000001gbk:国标a:00000001中:0000000100000001
1.编码之间的二进制户部识别2,存储和传输101010,但是不能是unicode的1010101,因为资源浪费了
数据类型intbool
strbyte与str的方法相同
listdict
python3x中的编码:python3x中str在内存中的编码方式是unicode。python3x中的str不能直接存储,和发送。bytes他的编码方式是非unicode(utf-8,gbk,gb2012.....)。对于英文:str:表现形式:s='laonanhai'内部编码:unicodebytes:表现形式:s=b'laonanhai'内部编码:非unicode.对于中文:str:表现形式:s='中国'内部编码:unicodebytes:00000001表现形式:s1=b'\xe4\xb8\xad\xe5\x9b\xbd'内部编码:非unicode.
str不能直接存储和传输
必须要转换为bytes类型,才可以。
s='laonanhai's1=b'laonanhai'print(s)print(s1)执行输出:
laonanhaib'laonanhai'
字符串前面的b表示bytes类型
字符串转换为bytes
s='中国's1=s.encode('utf-8')print(s1)执行输出:
b'\xe4\xb8\xad\xe5\x9b\xbd'
一个\表示一位,上面的输出,可以看出占用了6位。
s='alex's1=s.encode('utf-8')print(s1)执行输出:
b'alex'
转换为gbk
s='hellogirl's1=s.encode('gbk')print(s1)执行输出:
b'hellogirl'
bytes转换为str
s1=b'\xe4\xb8\xad\xe5\x9b\xbd's2=s1.decode(encoding='utf-8')print(s2)执行输出:
中国
只有将字符串写入文件或者发送数据时,才需要用到编码转换。
最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":[]},]foriinlist3:ifi['name']=='alex':list4[0]['hobby_list'].append(i['hobby'])else:list4[1]['hobby_list'].append(i['hobby'])print(list4)ViewCode第一种方法(推荐)
[{'hobby_list':['抽烟','喝酒','烫头','Massage'],'name':'alex'},{'hobby_list':['喊麦','街舞'],'name':'wusir'}]第二方法,使用setdeafult
dic={}#空字典li=[]#空列表forelinlist3:dic.setdefault(el["name"],[]).append(el['hobby'])#1.如果有当前name就返回对应列表并且追加新的hobby#2.如果没有,就返回空列表,追加hobby进去#字典的结果如下:#{'alex':['抽烟','喝酒','烫头','Massage'],'wusir':['喊麦','街舞']}fork,vindic.items():#遍历字典di={}#将新字典清空后追加到列表,防止每次循环k,v被更新替代di["name"]=k#设置姓名di["hobby_list"]=v#设置爱好li.append(di)#最加到列表中print(li)执行输出,效果同上!
第16题有一个bug,当输入1+ab还是会打印出总和,解决方法如下:
dic={'最终计算结果':None}whileTrue:#总和,必须要放到whlie循环里面,否则会和上次的计算结果相加the_sum=0#标志位,必须要放到whlie循环里面,否则无法重置flag=True#切割加号两边的数字content=input('请输入内容:').strip()foriincontent.split('+'):#去除加号2边数字的空格i=i.strip()#判断是否为数字ifi.isdigit():#自增加the_sum+=int(i)else:print("输入{}非法!".format(i))#如果包含了字母,标志为Falseflag=Falsecontinue#判断加号2边的,是否全是数字。ifflag:dic['最终计算结果']=the_sumprint(dic)执行效果如下:
购物车程序,达到的效果如下:
根据老师上次的代码
li=["手机","电脑",'鼠标垫','游艇']whileTrue:foriinli:print('{}\t{}'.format(li.index(i)+1,i))num=input('请输入商品序号:q/Q退出:').strip()ifnum.isdigit():num=int(num)ifnum>0andnum<=len(li):print(li[num-1])else:print('您输入的选项,超出范围,请重新输入')elifnum.upper()=='Q':breakelse:print('输入的有非数字,请重新输入')先修改一下执行的输出显示
goods=[{"name":"电脑","price":1999},{"name":"鼠标","price":10},{"name":"游艇","price":20},{"name":"美女","price":998},]whileTrue:print('请选择以下商品'.center(16,'*'))foriingoods:print('{}\t{}{}'.format(goods.index(i)+1,i['name'],i['price']))num=input('请选择您输入的商品序号(输入Q或者q为退出):').strip()ifnum.isdigit():num=int(num)ifnum>0andnum<=len(goods):print('您已经成功购买{}'.format(goods[num-1]['name']))else:print('您输入的选项,超出范围,请重新输入')elifnum.upper()=='Q':breakelse:print('输入的有非数字,请重新输入')执行输出:
增加一个输入框,用来输入资产,在购买商品之前,判断余额是否足够,扣除资产
goods=[{"name":"电脑","price":1999},{"name":"鼠标","price":10},{"name":"游艇","price":20},{"name":"美女","price":998},]#总资产whileTrue:assets=input('请输入你的总资产:').strip()ifassets.isdigit():assets=int(assets)breakelse:print('您输入是非数字,请重新输入')whileTrue:print('请选择以下商品'.center(16,'*'))#打印商品列表foriingoods:print('{}\t{}{}'.format(goods.index(i)+1,i['name'],i['price']))num=input('请选择您输入的商品序号(输入Q或者q为退出):').strip()ifnum.isdigit():num=int(num)ifnum>0andnum<=len(goods):#判断当前余额是否大于商品价格ifassets>=goods[num-1]['price']:#扣除商品价格后为当前余额assets-=goods[num-1]['price']else:print('当前余额不足,无法购买此商品!')else:print('您输入的选项,超出范围,请重新输入')elifnum.upper()=='Q':breakelse:print('输入的有非数字,请重新输入')执行输出:
加入购物车列表,输入q之后,打印购物车列表
程序:三级菜单要求:1.打印省、市、县三级菜单2.可返回上一级3.可随时退出程序
先准备基础数据
zone={'山东':{'青岛':['四方','黄岛','崂山','李沧','城阳'],'济南':['历城','槐荫','高新','长青','章丘'],'烟台':['龙口','莱山','牟平','蓬莱','招远']},'江苏':{'苏州':['沧浪','相城','平江','吴中','昆山'],'南京':['白下','秦淮','浦口','栖霞','江宁'],'无锡':['崇安','南长','北塘','锡山','江阴']},'浙江':{'杭州':['西湖','江干','下城','上城','滨江'],'宁波':['海曙','江东','江北','镇海','余姚'],'温州':['鹿城','龙湾','乐清','瑞安','永嘉']}}
以下展示的代码,不包含zone,因为占用行数太多了。
获取省列表
print(zone.keys())执行输出:
dict_keys(['浙江','山东','江苏'])
输出的类型是一个特殊类型,没有索引。但是我需要获取索引,怎么办?
把数据转换为列表不就可以了吗?
#省列表province=list(zone.keys())print(province)执行输出:
['浙江','山东','江苏']
打印省列表,并格式化输出
#省列表province=list(zone.keys())#打印省列表print('省'.center(20,'*'))foriinprovince:print('{}\t{}'.format(province.index(i)+1,i))执行输出:
增加一个输入框,用来输入省编号,这里需要循环输出,用while循环
并且判断输入的内容是否合规
#省列表province=list(zone.keys())#打印省列表print('省'.center(20,'*'))whileTrue:foriinprovince:print('{}\t{}'.format(province.index(i)+1,i))province_input=input('请输入省编号,或输入q/Q退出:').strip()ifprovince_input.isdigit():province_input=int(province_input)ifprovince_input>0andprovince_input<=len(province):passelse:print('省编号{}不存在!'.format(province_input))elifprovince_input.upper()=='Q':breakelse:print('输入省编号非法!')执行输出:
进入市列表
#省列表province=list(zone.keys())#打印省列表print('省'.center(20,'*'))whileTrue:foriinprovince:print('{}\t{}'.format(province.index(i)+1,i))province_input=input('请输入省编号,或输入q/Q退出:').strip()ifprovince_input.isdigit():province_input=int(province_input)ifprovince_input>0andprovince_input<=len(province):#省编号,由于显示加1,获取的时候,需要减1province_id=province_input-1#城市列表city=list(zone[province[province_id]].keys())#进入市区列表whileTrue:print('市'.center(20,'*'))forjincity:print('{}\t{}'.format(city.index(j)+1,j))city_input=input("请输入市编号,或输入b(back)返回上级菜单,或输入q(quit)退出:").strip()#退出省循环breakelse:print('省编号{}不存在!'.format(province_input))elifprovince_input.upper()=='Q':breakelse:print('输入省编号非法!')执行输出:
判断输入的市编号是否合规
#省列表province=list(zone.keys())#打印省列表print('省'.center(20,'*'))whileTrue:foriinprovince:print('{}\t{}'.format(province.index(i)+1,i))province_input=input('请输入省编号,或输入q/Q退出:').strip()ifprovince_input.isdigit():province_input=int(province_input)ifprovince_input>0andprovince_input<=len(province):#省编号,由于显示加1,获取的时候,需要减1province_id=province_input-1#城市列表city=list(zone[province[province_id]].keys())#进入市区列表whileTrue:print('市'.center(20,'*'))forjincity:print('{}\t{}'.format(city.index(j)+1,j))city_input=input("请输入市编号,或输入b(back)返回上级菜单,或输入q(quit)退出:").strip()ifcity_input.isdigit():city_input=int(city_input)ifcity_input>0andcity_input<=len(city):passelse:print('市编号{}不存在!'.format(city_input))else:print('输入市编号非法!')#退出省循环breakelse:print('省编号{}不存在!'.format(province_input))elifprovince_input.upper()=='Q':breakelse:print('输入省编号非法!')执行输出:
完成输入b返回上一级菜单功能
这里需要调整一下输出省列表的位置,删除多余的breck。还有输入q退出。
进入县级,打印县列表,并提示输入框。这里不能再输入数字了,直接提示返回或者退出
判断县输入的内容。这里直接判断是否输入的是b或者q。其他的直接提示,已经到底线了。
修改错误提示为红色字体,最终完整代码如下:
#小数据池#数字小数据池的范围-5~256#字符串中如果有特殊字符他们的内存地址就不一样#字符串中单个*20以内他们的内存地址一样,单个*21以上内存地址不一致#黑框框==终端#a='alex@'#a1='alex@'#print(aisa1)#Fales#n=5//2#n1=2#print(nisn1)#True#a='a'*21#b='a'*21#print(aisb)#a='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'#b='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'#print(aisb)#n=-6#n1=-6#print(nisn1)#False#n=-5#n1=-5#print(nisn1)#True#n=257#n1=257#print(nisn1)#True