Python自动化运维之1、Python入门
Python简介
python是吉多·范罗苏姆发明的一种面向对象的脚本语言,可能有些人不知道面向对象和脚本具体是什么意思,但是对于一个初学者来说,现在并不需要明白。大家都知道,当下全栈工程师的概念很火,而Python是一种全栈的开发语言,所以你如果能学好Python,那么前端,后端,测试,大数据分析,爬虫等这些工作你都能胜任。
Python入门
一、python安装
windows系统: 1、下载安装包 https://www.python.org/downloads/ 2、安装 默认安装路径:C:\python35 3、配置环境变量 【右键计算机】--》【属性】--》【高级系统设置】--》【高级】--》【环境变量】--》【在第二个内容框中找到 变量名为Path 的一行,双击】 --> 【Python安装目录追加到变值值中,用 ; 分割】 如:原来的值;C:\python35,切记前面有分号 linux系统: 无需安装,原装Python环境 ps:如果自带2.6,请更新至3.0以上 环境:yum install openssl-devel gcc++ gcc 可直接安装pip 更新版本到3.5.2 下载:wget https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz 解压:tar zxvf Python-3.5.2.tgz 编译:cd Python-3.5.2 ./configure --prefix=/usr/local/python3.5 安装:make && make install 默认安装位置/usr/local/lib/python3.5 执行命令python3.5进入到运行环境 mv /usr/bin/python /usr/bin/python2.7.7 ln -s /usr/local/python3.5/bin/python3.5 /usr/bin/python 修改yum环境 vi /usr/bin/yum 改为如下内容 #!/usr/bin/python2.7.7
建议使用pyenv(Python版本控制2.7和3.5之间随意切换)、virtualenv(Python虚拟环境)、pycharm(Python的IDE工具)、pip(Python包管理工具)。
pip安装:
windows: 1.在以下地址下载最新的PIP安装文件:http://pypi.python.org/pypi/pip#downloads 2.下载pip-9.01.tar.gz (md5, pgp)完成之后,解压到一个文件夹,用CMD控制台进入解压目录,输入:python setup.py install 3.安装好之后,我们直接在命令行输入pip,同样会显示‘pip’不是内部命令,也不是可运行的程序。因为我们还没有添加环境变量 C:\Python27\Scripts linux: 1、官网下载pip安装包 https://pypi.python.org/pypi/pip 2、解压下载的文件 tar zxvf pip-9.0.1.tar.gz 3、安装 python setup.py install 4、执行pip命令进行验证 ln -s /usr/local/python3.5/bin/pip3 /usr/bin/pip
二、编写Hello,World
两种方式输出Hello World,第一种我们用解释器交互式环境,打开shell输入python。
[root@localhost ~]# python3 Python 3.5.1 (default, Mar 29 2017, 13:52:32) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> print("Hello,Woeld!") Hello,Woeld!
[root@localhost ~]# cat hello.py print("Hello,Woeld!") [root@localhost ~]# python hello.py Hello,Woeld!
Python3 基础语法
行和缩进
学习Python与其他语言最大的区别就是,Python的代码块不使用大括号({})来控制类,函数以及其他逻辑判断。python最具特色的就是用缩进来写模块。
缩进的空白数量是可变的,但是所有代码块语句必须包含相同的缩进空白数量,这个必须严格执行。如下所示:
if True:
print ("True")
else:
print ("False")
有的是 tab 键缩进,有的是空格缩进,改为一致即可。
因此,在Python的代码块中必须使用相同数目的行首缩进空格数。
建议你在每个缩进层次使用 单个制表符 或 两个空格 或 四个空格 , 切记不能混用
Print 输出
print 默认输出是换行的,如果要实现不换行需要在变量末尾加上 end="":
#!/usr/bin/python3 x="a" y="b" # 换行输出 print( x ) print( y ) print('---------') # 不换行输出 print( x, end=" " ) print( y, end=" " ) print()
多行语句
Python 通常是一行写完一条语句,但如果语句很长,我们可以使用反斜杠(\)来实现多行语句,例如:
total = item_one + \ item_two + \ item_three
在 [], {}, 或 () 中的多行语句,不需要使用反斜杠(\),例如:
total = ['item_one', 'item_two', 'item_three', 'item_four', 'item_five']
空行
函数之间或类的方法之间用空行分隔,表示一段新的代码的开始。类和函数入口之间也用一行空行分隔,以突出函数入口的开始。
空行与代码缩进不同,空行并不是Python语法的一部分。书写时不插入空行,Python解释器运行也不会出错。但是空行的作用在于分隔两段不同功能或含义的代码,便于日后代码的维护或重构。
记住:空行也是程序代码的一部分。
等待用户输入
执行下面的程序在按回车键后就会等待用户输入:
#!/usr/bin/python3 input("\n\n按下 enter 键后退出。")
以上代码中 ,"\n\n"在结果输出前会输出两个新的空行。一旦用户按下键时,程序将退出。
同一行显示多条语句
Python可以在同一行中使用多条语句,语句之间使用分号(;)分割,以下是一个简单的实例:
#!/usr/bin/python3 import sys; x = 'runoob'; sys.stdout.write(x + '\n')
多个语句构成代码组
缩进相同的一组语句构成一个代码块,我们称之代码组。
像if、while、def和class这样的复合语句,首行以关键字开始,以冒号( : )结束,该行之后的一行或多行代码构成代码组。
我们将首行及后面的代码组称为一个子句(clause)。
如下实例:
if expression : suite elif expression : suite else : suite
更多python的基础教程 http://www.runoob.com/python3/python3-basic-syntax.html
三、变量&字符编码
变量
常量我们约定俗成都为大写
1、变量声明:
- Python将所有数据存为内存对象
- Python中,变量事实上是指向内存对象的引用
- 动态类型:在任何时刻,只要需要,某个对象引用都可以重新引用一个不同的对象(可以是不同的数据类型)内建函数type()用于返回给定数据项的数据类型
- "="用于将变量名与内存中的某个对象绑定:如果对象实现存在,就直接进行绑定;否则,则由"="创建引用的对象,变量名也是对象存在内存,比如:name='jerry',name这个指针指向jerry,name='tom'的时候,name是指针指向tom,但是jerry仍在内存中存放着,只是没有被变量名指向,到一定时候会被垃圾收集器回收,和java有点像。其中当test='jerry'时,test和name这两个变量名指向内存的地址是一样的。id(test),id(name),变量名是内存引用的标识或符号。
2、变量定义的规则:
- 变量名只能是 字母、数字或下划线的任意组合
- 变量名的第一个字符不能是数字
- 以下关键字不能声明为变量名
['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']
3、变量最佳命名方式:
- 使用下划线'_'作为连接,如 name_variables
- 使用大小写,称为驼峰法,如 NameVariables,nameVariables
注意:两种命名方式不要混用,只要你喜欢的一种即可
4、变量命名惯例:
- 以单一下划线开头的变量名(_x)不会被from module import * 语句导入
- 以两个下划线开头但结尾没有下划线的变量名(__x)是类的本地变量
- 前后有双下划线的变量名(__x__)是系统定义的变量名,对python解释器有特殊意义
- 交互式模式下,变量名"_"用于保存最后表达式的结果
字符编码
1、ASCII
ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,其最多只能用 8 位来表示(一个字节),即:2**8 = 256-1,所以,ASCII码最多只能表示 255 个符号,python2.x解释器默认是ASCII编码。
显然ASCII码无法将世界上的各种文字和符号全部表示,所以,就需要新出一种可以代表所有字符和符号的编码,即:Unicode
2、Unicode
Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,规定所有的字符和符号最少由 16 位来表示(2个字节),即:2 **16 = 65536,注:此处说的的是最少2个字节,可能更多,比如汉字就需要3个字节,python3.x解释器默认是Unicode编码。
UTF-8,是对Unicode编码的压缩和优化,他不再使用最少使用2个字节,而是将所有的字符和符号进行分类:ASCII码中的内容用1个字节保存、欧洲的字符用2个字节保存,东亚的字符用3个字节保存...
所以,python2.x解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ASCII),如果是如下代码的话:
[root@localhost ~]# cat hello.py #!/usr/bin/env python print "你好!世界" [root@localhost ~]# python hello.py File "hello.py", line 2 SyntaxError: Non-ASCII character '\xe4' in file hello.py on line 2, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
改正:应该显示的告诉python解释器,用什么编码来执行源代码,即:
#!/usr/bin/python # -*- coding: UTF-8 -*- print "你好,世界"
[root@localhost ~]# python hello.py 你好!世界
所以如果大家在学习过程中,代码中包含中文,就需要在头部指定编码。
注意:Python3.X 源码文件默认使用utf-8编码,所以可以正常解析中文,无需指定 UTF-8 编码。
四、用户交互及字符串拼接
跟用户进行交互,并把输入的信息打印出来
#!/usr/bin/env python # -*- coding:utf-8 -*-
# -Author-zsq
###########用户交互及字符串拼接################ # python2.X与python3.X区别: python2.X raw_input = python3.X input # 提示用户输入姓名、年龄、工作、工资并以信息列表的形式打印出 name = input("Please input your name:") age = int(input("Please input your age:")) #str强制转换为int job = input("Please input your job:") salary = input("Please input your salary:") info1 = ''' ------------ Info of %s --------- Name:%s Age:%d Job:%s Salary:%s ''' %(name,name,age,job,salary) #%s检测数据类型为字符串,%d检测数据类型为整数,%f检测数据类型为浮点数 强制 print(info1) info2 = ''' ------------ Info of {_Name} --------- Name:{_Name} Age:{_Age} Job:{_Job} Salary:{_Salary} ''' .format(_Name=name, _Age=age, _Job=job, _Salary=salary) print(info2) info3 = ''' ------------ Info of {0} --------- Name:{0} Age:{1} Job:{2} Salary:{3} ''' .format(name,age,job,salary) print(info3)
五、if判断语句
① 实例:用if语句验证用户登录,密文密码
#!/usr/bin/env python # -*- coding:utf-8 -*- # -Author-zsq #############验证用户登录-密文密码############## # 提示输入用户名密码 # 验证用户名密码 # 如果错误,则输出用户名密码错误 # 如果成功,则输出欢迎,xxx! #在pycharm IDE工具中这段代码是行不通的,在Linux命令行或者Windows cmd中是可以的 import getpass # 标准模块,import调用 name = input("Please input your name:") password = getpass.getpass("Please input your password:") if name == "lzl" and 'pwd' == "lzl@123": print("Welcome to,lzl!") else: print("The user name and password mistake")
② 实例:用if语句实现猜幸运数字游戏
#!/usr/bin/env python # -*- coding:utf-8 -*- #-Author-zsq ##############猜幸运数字################ # 提示用户输入猜的幸运数字(1-100) # 根据输入的数字做判断 # 如果猜对,输出恭喜你猜对了 # 如果猜的数字大了,输出数字往小点猜 # 否则,输出数字往大点猜 lucky_num = 66 guess_num = int(input("Please enter your guess lucky number(1-100):")) if guess_num == lucky_num: print ("Congratulations you guessed it!") elif guess_num > lucky_num : print ("Think it smaller...") else: print ("Think it bigger...")
六、while循环语句
① 实例:猜数字游戏升级版(循环猜数字,直到猜到为止)
#!/usr/bin/env python # -*- coding:utf-8 -*- #-Author-zsq ##############猜幸运数字################ lucky_num = 66 # 设置幸运数字 while True: # while循环: # 输入猜的的幸运数字范围1-100 guess_num = int(input("Please enter your guess lucky number(1-100):")) if guess_num == lucky_num: # 如果猜对,输出恭喜你猜对了,并退出 print ("Congratulations you guessed it!") break #break 结束循环 continue 跳出本次循环,继续下次循环 exit 结束程序 elif guess_num > lucky_num : # 如果猜的数字大了,输出数字往小点猜 print ("Think it smaller...") else: # 否则,输出数字往大点猜 print ("Think it bigger...")
② 实例:猜数字游戏完善版(循环猜数字,允许猜三次机会)
#!/usr/bin/env python # -*- coding:utf-8 -*- #-Author-zsq ##############猜幸运数字+次数限制################ lucky_num = 66 # 设置幸运数字 count = 0 # 设置初始值count=0 while count < 3 : # while判断count是否小于3,如果小于3则: # 输入猜的的幸运数字范围1-100 guess_num = int(input("Please enter your guess lucky number(1-100):")) if guess_num == lucky_num: # 如果猜对,输出恭喜你猜对了,并退出 print ("Congratulations you guessed it!") break #break 结束循环 continue 跳出本次循环,继续下次循环 exit 结束程序 elif guess_num > lucky_num : # 如果猜的数字大了,输出数字往小点猜 print ("Think it smaller...") else: # 否则,输出数字往大点猜 print ("Think it bigger...") count += 1 #每次循环结束count加1 else: print ("You tried so many times!") #while循环超过三次,则输出试过太多次了
七、for循环语句
实例:用for循环实现猜数字游戏,限制三次机会
#!/usr/bin/env python # -*- coding:utf-8 -*- #-Author-zsq ##############猜幸运数字+次数限制################ lucky_num = 66 # 设置幸运数字 for i in range(3): # while判断count是否小于3,如果小于3则: # 输入猜的的幸运数字范围1-100 guess_num = int(input("Please enter your guess lucky number(1-100):")) if guess_num == lucky_num: # 如果猜对,输出恭喜你猜对了,并退出 print ("Congratulations you guessed it!") break #break 结束循环 continue 跳出本次循环,继续下次循环 exit 结束程序 elif guess_num > lucky_num : # 如果猜的数字大了,输出数字往小点猜 print ("Think it smaller...") else: # 否则,输出数字往大点猜 print ("Think it bigger...") else: print ("You tried so many times!") #while循环超过三次,则输出试过太多次了
八、扩展
① 编写登陆接口 要求:
- 输入用户名密码
- 认证成功后显示欢迎信息
- 输错三次后锁定
# 流程图如下:
# login_interface.py 程序代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#!/usr/bin/env python # -*- coding:utf-8 -*- #-Author-zsq ################登录接口程序################ # -*- 运行环境python3.5.2 -*- #user_information、locked_information、day1_login_interface.py三个文件拷贝到同一级目录 #授权:chmod 755 day1_login_interface.py #执行:python day1_login_interface.py ####记录可登录用户、密码信息文件user_information#### # Dave dave123 # John john123 # Luffy luffy123 ####记录被锁定的用户信息文件locked_information#### # lzl # Alex # Count = 1 #设置计数器,统计下面第一个while大循环的次数 赋值变量Count,初始值为1 Last_user = "" #针对上次登录的用户名进行记录,如果连续三次登录错误的用户名是一致的话才进行锁定 #赋值变量Last_user,初始值为空 Match_count = 1 #统计Last_user与上次登录的用户名匹配的次数,变量Match_count初始值为1 while True: Locked = open("locked_information", "r") # 读取被锁定用户名信息文件 User_pwd = open("user_information", "r") # 读取可登录的用户、密码信息文件 User = input("Please enter the login username:") #提示用户输入登录用户名并赋值给User Passwd = input("Please enter login password:") # 提示用户输入登录密码并赋值给Passwd if len(User) == 0: print("Error:Enter the user is null! please try again..") continue if Last_user == User: #if语句判断,本次登录的用户名跟上次登录的用户名是否匹配 Match_count +=1 #如果匹配成功,表示两次连续登录的用户名一致,Match_count计数加1 else: #如果匹配失败,Match_count计数恢复为初始值1 Match_count = 1 Re_count = 3 - Count #设置变量Re_count为还进行登录的剩余次数,判断登录失败后会用到 for Blacklist in Locked.readlines(): #for循环读取被锁定用户名,生成变量Blacklist Blacklist = Blacklist.strip("\n") #对变量Blacklist进行去换行符操作 if User == Blacklist: #判断如果输入的用户名在Blacklist中,则提示用户被锁定并退出登录 print ("Login username ",User," is locked, login fails...") exit() #退出程序 for i_f_m in User_pwd.readlines(): #for循环读取可登录用户、密码信息文件,赋值变量i_f_m i_f_m = (i_f_m.strip("\n")).split() #对变量i_f_m进行先去换行符,然后以空格符分割为列表的操作 if User == i_f_m[0] and Passwd == i_f_m[1]: #对登录用户名和密码进行匹配,两者都匹配成功则显示恭喜登陆成功 print ("Congratulations to login successful!") exit() #退出程序 print(User,Passwd) else: if Re_count > 0 : #验证上面for循环匹配失败并且剩余登录次数大于0后,提示错误和剩余次数 #如果去掉if判断,则在匹配用户锁定时打印信息重合,放到下面while循环里面则会添加多余输出 print("Error: The username and password mistate! You can also try", Re_count, "times...") while Re_count > 0 : #while循环语句,重试登录次数大于0时,提示用户是否还要继续登陆 If_cont = input("Whether or not to continue to login?(Y/N):") if If_cont == "Y": #匹配字符Y break #跳出当前while,重新输入用户名密码 elif If_cont == "N": #匹配字符N print ("-- Bye --") exit() #终止程序 else: #字符输入错误,重新提示输入正确的字符Y 和 N print("* Please enter 【Y】 or 【N】 *") continue #跳出当前循环执行下次循环 else: #while循环语句,当用户重试登录次数为0时,执行下面语句 if Match_count == 3: #连续三次输入的用户名一致,把用户名加入到黑名单 Locked = open("locked_information", "a") #对文件locked_information追加写操作 Locked.write(User + "\n") #把用户名写入到黑名单并执行下换行符 print("Error: The username and password mistate! The current user ",User," is locked...") break #提示锁定用户并退出程序 else: #连续三次输入的用户名不一致,提示用户名密码错误,不进行锁定 print ("Error: The username and password mistate! Bye-bye!") break #退出程序 Count +=1 #循环结束,Count计数加1 Last_user = User #循环结束,Last_userc重新赋值 Locked.close() User_pwd.close()
# 程序 readme
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 这是一个模拟真实用户登录系统的程序 ### 实现效果: * user_information文件记录了可登录用户名和密码,每次登录只有完全匹配文件中的用户名和密码才能登录 * locked_information文件记录了被锁定的用户,每次登录输入被锁定的用户,会提示当前用户被锁定,并退出 * 用户连续三次登录失败且三次输入的用户名一样,会显示当前用户被锁定,退出程序并且把用户名记录到locked_information * 用户连续三次登录失败,但三次的用户名不一样,提示登录失败,退出程序用户名不锁定 * 前两次登录失败时可选择是否还要继续登录,登录失败时会显示剩余登录次数 ### Bug 可完善的地方: * 随意输入任何用户名都可进行登录,即使不存在与user_information文件中也可被锁定 * 输入的密码时可以改成密文的形式 ### 运行环境: * Python3.0+ 最佳Python3.5.2 ### 目录结构: Day1 ├── 登录接口 │ ├── day1_login_interface.py │ └── locked_information │ ├── user_information │ ├── login_interface.png │ └── readme ### linux 运行说明: * user_information、locked_information、day1_login_interface.py拷贝到同一级目录下 * 加执行权限 chmod 755 day1_login_interface.py * 执行程序 python day1_login_interface.py
② 多级菜单,查询街道/地区邮政编码
- 三级菜单
- 可依次选择进入各子菜单
- 子菜单实现b可以返回,q可以退出
# multistage_menu.py程序代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#!/usr/bin/env python # -*- coding:utf-8 -*- #-Author-zsq ################多级菜单,查询街道/地区邮政编码################ # -*- 运行环境python3.5.2 -*- #授权:chmod 755 day1_multistage_menu.py #执行:python day1_multistage_menu.py #注:定义Main_menu主菜单 字典套字典套列表形式 Main_menu = { #定义主菜单Main_menu作为数据库 '北京':{ '石景山区':['八宝山街道','老山街道','八角街道','古城街道','苹果园街道','金顶街街道','广宁街道','鲁谷社区'], '朝阳区':['和平街街道','朝外街道','劲松街道','建外街道','呼家楼街道','八里庄街道','三里屯街道','潘家园街道'], '昌平区':['城北街道','城南街道','天通苑北街道','天通苑南街道','霍营街道','回龙观街道','龙泽园街道','史各庄街道'], '东城区':['安定门街道','建国门街道','东直门街道','天坛街道','东四街道','龙潭街道','前门街道','景山街道'], '海淀区':['清华园街道','香山街道','清河街道','上地街道','万柳地区','中关村街道','海淀街道','学院路街道'] }, '上海':{ '黄浦区':['南京东路街道','外滩街道','半淞园路街道','小东门街道','豫园街道','老西门街道','五里桥街道','淮海中路街道'], '浦东新区':['潍坊新村街道','陆家嘴街道','周家渡街道','塘桥街道','洋泾街道','东明路街道','花木街道','浦兴路街道'], '徐汇区':['湖南路街道','天平路街道','枫林路街道','徐家汇街道','斜土路街道','长桥街道','龙华街道','田林街道'], '长宁区':["华阳路街道","新华路街道","江苏路街道","天山路街道","周家桥街道","虹桥街道","仙霞新村街道","程家桥街道"], '杨浦区':['定海路街道','平凉路街道','江浦路街道','四平路街道','控江路街道','长白新村街道','延吉新村街道','殷行街道'] }, '香港':{ '香港岛':['中西区','湾仔区','东区','南区','石澳','大浪湾','夏萍湾','龟背湾'], '九龙半岛':['油尖旺区','深水埗区','九龙城区','黄大仙区','观塘区','维多利亚港','旺角','新蒲岗'], '新界':['北区','大埔区','沙田区','西贡区','荃湾区','屯门区','元朗区','葵青区'], '港岛区':['中环','湾仔','南区','太平山','尖沙咀','钻石山','山顶','大屿山'], '九龙区':['龙门','九龙','侯王庙','万佛寺','东普陀','青松观','妙法寺','灵渡寺'] } } import random #调用random,生成邮编码 while True: Num_ct = 1 #城市ID序号,初始值1 Dic_city = {} #定义字典,初始值空 Dic_county = {} Dic_street = {} print(" -*- 邮政编码查询系统 -*-") for City in Main_menu.keys(): #循环 把可选的城市赋值给变量City print ("",Num_ct,City) #打印ID序号和城市名 Dic_city[Num_ct] = City #绑定ID序号和城市名,生成字典Dic_city Num_ct +=1 #每次循环ID序号+1 print( " q", "退出程序") City_id = input("请输入要查询城市的ID序号 :") #for循环结束,输入要选择的城市ID 注:此时输入的类型为字符串 if City_id == "q": # 判断输入是否为q 退出程序 print(" -*- Bye-bye! -*-") exit() elif City_id in ['1','2','3']: #匹配输入是否为1,2,3 City_id = int(City_id) #字符类型转换 注:如果不转换,下面字典匹配不到key值 Sec_menu = (Main_menu.get((Dic_city.get(City_id)))) #定义二级菜单,生成二级数据库 while True: #while 循环 Num_co = 1 #市区ID序号,初始值1 for County in Sec_menu.keys(): #循环 把可选的市区赋值给变量County print("",Num_co, County) #打印ID序号和市区名 Dic_county[Num_co] = County #绑定ID序号和市区名,生成字典Dic_county Num_co += 1 #每次循环ID序号+1 print(" b", "返回上级重新选择城市", "\n", "q", "退出程序") County_id = input("请输入要查询城区的ID序号 :") #输入要选择的市区ID if County_id == "b": #判断输入是否为b 返回上级菜单 break elif County_id == "q": #判断输入是否为q 退出程序 print(" -*- Bye-bye! -*-") exit() elif County_id in ['1','2','3','4','5']: #判断输入是否为1-5 County_id = int(County_id) #字符类型转换 Third_menu = (Sec_menu.get((Dic_county.get(County_id)))) #定义三级菜单,生成三级数据库 while True: #while 循环 Num_st = 1 #街道数字标号,初始值1 for Street in Third_menu: #循环 把可选的街道赋值给变量Street print ("",Num_st,Street) #打印ID序号和街道名 Dic_street[Num_st] = Street #绑定ID序号和市区名,生成字典Dic_street Num_st +=1 #每次循环ID序号+1 print (" b","返回上级重新查询城区","\n","q","退出程序") Street_id = input("请输入要查询街道/区域的ID序号 :") #输入要选择的街道ID序号 if Street_id == "b": #判断输入是否为b 返回上级菜单 break elif Street_id == "q": #判断输入是否为q 退出程序 print(" -*- Bye-bye! -*-") exit() elif Street_id in ['1', '2', '3', '4', '5','6','7','8']: #判断输入是否为1-8 Street_id = int(Street_id) #字符类型转换 print("您查询的地址:",Dic_city.get(City_id),Dic_county.get(County_id),Dic_street.get(Street_id), " 邮政编码为:",random.randint(100000,300000)) #查询成功 输出 exit() #查询成功 退出 ####留位####注:如果还行输入成功后加判断是否继续查询,可在此加代码 else: #输入格式错误,提示 print(" 输入的格式错误!请重新输入数字 1 & 2 & ... & 7 & 8 或字符 b & q") else: #输入格式错误,提示 print(" 输入的格式错误!请重新输入数字 1 & 2 & 3 & 4 & 5 或字符 b & q") else: #输入格式错误,提示 print(" 输入的格式错误!请重新输入数字 1 & 2 & 3 或 字符 q")
# 程序 readme
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 这是一个模拟查询街道/地区邮政编码的程序 # 多级菜单,使用了字典套字典套列表的形式 ### 实现效果: * 进入程序每级菜单可选择要查询的ID序号,选择序号会进入到相应的地区子菜单中 * 每级菜单都可输入b返回上一级菜单,输入q可退出程序 * 任何一级菜单输入错误的字符,会提示重新输入ID序号 * 最后三级菜单选择完毕,输入选择地区的邮政编码,查询完成,退出程序 ### Bug 可完善的地方: * 邮政编码由随机数设定,数据不准确 * 由于用到的字典是无序的,所以同一级菜单每次显示的ID序号可能不一样 ### 运行环境: * Python3.0+ 最佳Python3.5.2 ### 目录结构: Day1 ├── 三级菜单 │ ├── day1_multistage_menu.py │ ├── multistage_menu.png │ └── readme ### linux 运行说明: * 加执行权限 chmod 755 day1_multistage_menu.py * 执行程序 python day1_multistage_menu.py