Python运维开发【一】:简介和入门

 Python简介

       Python的创始人为Guido van Rossum。1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为ABC 语言的一种继承。之所以选中Python(大蟒蛇的意思)作为程序的名字,是因为他是一个叫Monty Python的喜剧团体的爱好者。

  ABC是由Guido参加设计的一种教学语言。就Guido本人看来,ABC 这种语言非常优美和强大,是专门为非专业程序员设计的。但是ABC语言并没有成功,究其原因,Guido 认为是非开放造成的。Guido 决心在Python 中避免这一错误。同时,他还想实现在ABC 中闪现过但未曾实现的东西。

  就这样,Python在Guido手中诞生了。可以说,Python是从ABC发展起来,主要受到了Modula-3(另一种相当优美且强大的语言,为小型团体所设计的)的影响。并且结合了Unix shell和C的习惯。

  Python  已经成为最受欢迎的程序设计语言之一。2011年1月,它被TIOBE编程语言排行榜评为2010年度语言。自从2004年以后,python的使用率是呈线性增长。

Python入门

一、python安装

官网:https://www.python.org/downloads/

windows系统:

官网下载安装包
  https://www.python.org/downloads/
安装
    按照选项进行选择
    3.0以上版本建议安装过程中直接选择添加环境变量选项
配置环境变量(2.7版本)
  【右键计算机】--》【属性】--》【高级系统设置】--》【高级】--》【环境变量】--》【在第二个内容框中找到 变量名为Path 的一行,双击】 --> 【Python安装目录追加到变值值中,用 ; 分割】
  如:原来的值;C:\python27,切记前面有分号

 

 Linux系统:

无需安装,默认自带Python环境。

如:Centos6.8_X86_64 自带Python2.6.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.6.6
ln -s /usr/local/python3.5/bin/python3.5 /usr/bin/python
修改yum环境     vim /usr/bin/yum
改为如下内容  #!/usr/bin/python2.6.6

 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/pip3

二、第一个python程序

Hello World!

# vim hello.py

1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 #Author:Arthur
4  
5 print ("Hello World!")

 #执行:

#python hello.py

三、变量赋值及命名规则

 声明变量

声明一个变量name,变量name的值为:"Arthur Liu"

1 # _*_ coding:utf-8 _*_
2 
3 name = "Arthur Liu"

变量命名的规则

变量定义的规则:
 
变量名只能是 字母、数字或下划线的任意组合
变量名的第一个字符不能是数字
以下关键字不能声明为变量名
['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']

变量扩展知识

给变量name1赋值"Arthur Liu",变量name2赋值为name1,name1重新赋值为"Jack Chen",此时name2的值为多少?

 1 # _*_ coding:utf-8 _*_
 2 
 3 name1 = "Arthur Liu"
 4 
 5 name2 = name1
 6 print(name1,name2)
 7 
 8 name1 = "Jack Chen"
 9 print("What is the value of name2 now?")
10 print(name1,name2)
11 
12 #name1的值为Jack Chen,name2此时的值仍为Arthur Liu

 

  1. name1指向Arthur Liu
  2. name2指向name1
  3. name2根据name1指向Arthur Liu
  4. name1重新指向Jack Chen

注:name2指向name1时,实际上指向的是name1指向的值(内存),所以不会随着name1指向值的变化而变化

 

四、字符编码

 

python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ascill)

ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,其最多只能用 8 位来表示(一个字节),即:2**8 = 256-1,所以,ASCII码最多只能表示 255 个符号。

关于中文

为了处理汉字,程序员设计了用于简体中文的GB2312和用于繁体中文的big5。

GB2312(1980年)一共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。

GB2312 支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。2000年的 GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。现在的PC平台必须支持GB18030,对嵌入式产品暂不作要求。所以手机、MP3一般只支持GB2312。

从ASCII、GB2312、GBK 到GB18030,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。在这些编码中,英文和中文可以统一地处理。区分中文编码的方法是高字节的最高位不为0。按照程序员的称呼,GB2312、GBK到GB18030都属于双字节字符集 (DBCS)。

有的中文Windows的缺省内码还是GBK,可以通过GB18030升级包升级到GB18030。不过GB18030相对GBK增加的字符,普通人是很难用到的,通常我们还是用GBK指代中文Windows内码。

 

显然ASCII码无法将世界上的各种文字和符号全部表示,所以,就需要新出一种可以代表所有字符和符号的编码,即:Unicode

Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,规定虽有的字符和符号最少由 16 位来表示(2个字节),即:2 **16 = 65536,
注:此处说的的是最少2个字节,可能更多

UTF-8,是对Unicode编码的压缩和优化,他不再使用最少使用2个字节,而是将所有的字符和符号进行分类:ascii码中的内容用1个字节保存、欧洲的字符用2个字节保存,东亚的字符用3个字节保存...

所以,python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ascill),如果是如下代码的话:

报错:ASCII无法表示中文

SyntaxError: Non-ASCII character

1 #!/usr/bin/env python
2 print("你好,世界")

改正:应该显示的告诉python解释器,用什么编码来执行源代码:

1 #!/usr/bin/env python
2 #_*_ coding:utf-8 _*_
3 print("你好,世界")

注:python2.X版本,默认的字符编码为ASCII,而python3.X版本,默认的字符编码为Unicode,不用声明字符编码可以直接显示中文,不会报错。

 

注释

 

当行注视:# 被注释内容

 

多行注释:""" 被注释内容 """

 

五、用户交互及字符串拼接

跟用户进行交互,并把输入的信息打印出来

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 #Author: Arthur
 4 ###########用户交互及字符串拼接################
 5 # python2.X与python3.X区别:    python2.X raw_input = python3.X input
 6 # 提示用户输入姓名、年龄、工作、工资并以信息列表的形式打印出
 7  
 8 #name = raw_input("What is your name?") #only on python 2.x
 9 name = input("Please input your name:")
10 age = int(input("Please input your age:"))  #str强制转换为int
11 job = input("Please input your job:")
12 salary = input("Please input your salary:")
13  
14 info1 = '''
15 ------------  Info of %s  ---------
16 Name:%s
17 Age:%d
18 Job:%s
19 Salary:%s
20 ''' %(name,name,age,job,salary)     #%s检测数据类型为字符串,%d检测数据类型为整数,%f检测数据类型为浮点数 强制
21 print(info1)
22  
23 info2 = '''
24 ------------  Info of {_Name}  ---------
25 Name:{_Name}
26 Age:{_Age}
27 Job:{_Job}
28 Salary:{_Salary}
29 ''' .format(_Name=name,
30             _Age=age,
31             _Job=job,
32             _Salary=salary)
33 print(info2)
34  
35 info3 = '''
36 ------------  Info of {0}  ---------
37 Name:{0}
38 Age:{1}
39 Job:{2}
40 Salary:{3}
41 ''' .format(name,age,job,salary)
42 print(info3)
View Code

 

六、if 判断语句

  1、用if语句判断用户登录,密码密文利用getpass 模块中的 getpass方法:

 

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 #Author:Arthur
 4 """验证用户登录-密文密码利用getpass模块中的getpass方法"""
 5 # 提示输入用户名密码
 6 # 验证用户名密码
 7 #       如果错误,则输出用户名密码无效
 8 #       如果成功,则输出Hello,xxx!
 9  
10 import getpass     #标准模块,import调用
11  
12 name = input("Please input your name:")
13 password = getpass.getpass("Please input your password:")
14  
15 if name == "Arthur" and password == "test@123":
16     print ("Hello %s!"%name)
17 else:
18     print ("Invalid username or password!")
View Code

  2、用if语句实现猜年龄游戏

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3  
 4  
 5 my_age = 25
 6  
 7 user_input = int(input("input your guess num:"))
 8  
 9 if user_input == my_age:
10     print("Congratulations, you got it !")
11 elif user_input < my_age:
12     print("Oops,think bigger!")
13 else:
14     print("think smaller!")
View Code

 

 七、while循环语句

  1、用while语句循环100次

1 # Author:Arthur Liu
2 count = 0           #从0开始
3 while True:
4     print("你是我的小呀小苹果。。。",count)     #从0开始
5     count +=1       #逐次加1
6     if count == 100:    #count等于100,执行下面代码
7         print("---end---怎么爱你都不嫌多。。。")
8         break
View Code

  2、用while循环,实现用户猜年龄,最多3次机会,猜不对就退出程序

 1 # _*_ coding:utf-8 _*_
 2 # Author:Arthur Liu
 3 
 4 my_age = 25
 5 
 6 count = 0
 7 while count < 3:
 8     user_input = int(input("input your guess num:"))
 9 
10     if user_input == my_age:
11         print("Congratulations, you got it !")
12         break
13     elif user_input < my_age:
14         print("think bigger!")
15     else:
16         print("think smaller!")
17     count += 1 #每次loop 计数器+1
18 else:
19     print("猜这么多次都不对,再见.")
View Code

 

 八、for循环语句

  1、用for循环语句实现用户猜年龄,最多3次机会,猜不对就退出程序

 1 # _*_ coding:utf-8 _*_
 2 # Author:Arthur Liu
 3 
 4 my_age = 25
 5 
 6 for i in range(3):
 7     user_input = int(input("input your guess num:"))
 8     if user_input == my_age:
 9         print("Congratulations, you got it !")
10         break
11     elif user_input < my_age:
12         print("think bigger!")
13     else:
14         print("think smaller!")
15 else:
16     print("猜这么多次都不对,再见.")
View Code

 九、练习

  1、编写登陆接口

  • 输入用户名密码
  • 认证成功后显示欢迎信息
  • 输错3次后锁定

      login_interface.py 程序代码

 

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#-Author: Arthur
################登录接口程序################

# -*-      运行环境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()

login_interface.py
View Code

  流程图:

 

 

  README:

# 这是一个模拟真实用户登录系统的程序

### Author:Arthur


### 实现效果:
* 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

readme
View Code

 

 

  2、多级菜单

  • 三级菜单
  • 可依次选择进入各子菜单
  • 子菜单实现b可以返回上一级,q可以退出程序
  • 所需知识点:列表、字典

 

  multistage_menu.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#-Author:Arthur
################多级菜单,查询街道/地区邮政编码################

# -*-      运行环境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")

multistage_menu.py
View Code

  流程图:

 

    README:

# 这是一个模拟查询街道/地区邮政编码的程序
# 多级菜单,使用了字典套字典套列表的形式

### Author:Arthur

### 实现效果:
* 进入程序每级菜单可选择要查询的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

readme
View Code

 

十、pycharm使用

  1、下载安装:

    http://www.jetbrains.com/pycharm/download/#section=windows

    pycharm是一种Python IDE,能够帮助我们在编写代码时提高效率。 网上提供的有专业版和教育版之分。

  2、常用设置

    1)解释器设置:

  2)模板设置:

  不用每次写头信息:解释器,字符集,作者等等

 

   3)文字大小和颜色和风格 

    打开file->settings->Editor-> Font  /  Color Scheme

 

  3、常用快捷键

1、编辑(Editing)

Ctrl + Space    基本的代码完成(类、方法、属性)
Ctrl + Alt + Space  快速导入任意类
Ctrl + Shift + Enter    语句完成
Ctrl + P    参数信息(在方法中调用参数)
Ctrl + Q    快速查看文档

F1   外部文档

Shift + F1    外部文档,进入web文档主页

Ctrl + Shift + Z --> Redo 重做

Ctrl + 鼠标    简介/进入代码定义
Ctrl + F1    显示错误描述或警告信息
Alt + Insert    自动生成代码
Ctrl + O    重新方法
Ctrl + Alt + T    选中
Ctrl + /    行注释/取消行注释
Ctrl + Shift + /    块注释
Ctrl + W    选中增加的代码块
Ctrl + Shift + W    回到之前状态
Ctrl + Shift + ]/[     选定代码块结束、开始
Alt + Enter    快速修正
Ctrl + Alt + L     代码格式化
Ctrl + Alt + O    优化导入
Ctrl + Alt + I    自动缩进
Tab / Shift + Tab  缩进、不缩进当前行
Ctrl+X/Shift+Delete    剪切当前行或选定的代码块到剪贴板
Ctrl+C/Ctrl+Insert    复制当前行或选定的代码块到剪贴板
Ctrl+V/Shift+Insert    从剪贴板粘贴
Ctrl + Shift + V    从最近的缓冲区粘贴
Ctrl + D  复制选定的区域或行
Ctrl + Y    删除选定的行
Ctrl + Shift + J  添加智能线
Ctrl + Enter   智能线切割
Shift + Enter    另起一行
Ctrl + Shift + U  在选定的区域或代码块间切换
Ctrl + Delete   删除到字符结束
Ctrl + Backspace   删除到字符开始
Ctrl + Numpad+/-   展开/折叠代码块(当前位置的:函数,注释等)
Ctrl + shift + Numpad+/-   展开/折叠所有代码块
Ctrl + F4   关闭运行的选项卡
 2、查找/替换(Search/Replace)
F3   下一个
Shift + F3   前一个
Ctrl + R   替换
Ctrl + Shift + F  或者连续2次敲击shift   全局查找{可以在整个项目中查找某个字符串什么的,如查找某个函数名字符串看之前是怎么使用这个函数的}
Ctrl + Shift + R   全局替换
 3、运行(Running)
Alt + Shift + F10   运行模式配置
Alt + Shift + F9    调试模式配置
Shift + F10    运行
Shift + F9   调试
Ctrl + Shift + F10   运行编辑器配置
Ctrl + Alt + R   运行manage.py任务
 4、调试(Debugging)
F8   跳过
F7   进入
Shift + F8   退出
Alt + F9    运行游标
Alt + F8    验证表达式
Ctrl + Alt + F8   快速验证表达式
F9    恢复程序
Ctrl + F8   断点开关
Ctrl + Shift + F8   查看断点
 5、导航(Navigation)
Ctrl + N    跳转到类
Ctrl + Shift + N    跳转到符号
Alt + Right/Left    跳转到下一个、前一个编辑的选项卡
F12    回到先前的工具窗口
Esc    从工具窗口回到编辑窗口
Shift + Esc   隐藏运行的、最近运行的窗口
Ctrl + Shift + F4   关闭主动运行的选项卡
Ctrl + G    查看当前行号、字符号
Ctrl + E   当前文件弹出,打开最近使用的文件列表
Ctrl+Alt+Left/Right   后退、前进
Ctrl+Shift+Backspace    导航到最近编辑区域
Alt + F1   查找当前文件或标识
Ctrl+B / Ctrl+Click    跳转到声明
Ctrl + Alt + B    跳转到实现
Ctrl + Shift + I查看快速定义
Ctrl + Shift + B跳转到类型声明
Ctrl + U跳转到父方法、父类
Alt + Up/Down跳转到上一个、下一个方法
Ctrl + ]/[跳转到代码块结束、开始
Ctrl + F12弹出文件结构
Ctrl + H类型层次结构
Ctrl + Shift + H方法层次结构
Ctrl + Alt + H调用层次结构
F2 / Shift + F2下一条、前一条高亮的错误
F4 / Ctrl + Enter编辑资源、查看资源
Alt + Home显示导航条F11书签开关
Ctrl + Shift + F11书签助记开关
Ctrl + #[0-9]跳转到标识的书签
Shift + F11显示书签
 6、搜索相关(Usage Search)
Alt + F7/Ctrl + F7文件中查询用法
Ctrl + Shift + F7文件中用法高亮显示
Ctrl + Alt + F7显示用法
 7、重构(Refactoring)
F5复制F6剪切
Alt + Delete安全删除
Shift + F6重命名
Ctrl + F6更改签名
Ctrl + Alt + N内联
Ctrl + Alt + M提取方法
Ctrl + Alt + V提取属性
Ctrl + Alt + F提取字段
Ctrl + Alt + C提取常量
Ctrl + Alt + P提取参数
 8、控制VCS/Local History
Ctrl + K提交项目
Ctrl + T更新项目
Alt + Shift + C查看最近的变化
Alt + BackQuote(’)VCS快速弹出
 9、模版(Live Templates)
Ctrl + Alt + J当前行使用模版
Ctrl +J插入模版
 10、基本(General)
Alt + #[0-9]打开相应的工具窗口
Ctrl + Alt + Y同步
Ctrl + Shift + F12最大化编辑开关
Alt + Shift + F添加到最喜欢
Alt + Shift + I根据配置检查当前文件
Ctrl + BackQuote(’)快速切换当前计划
Ctrl + Alt + S 打开设置页
Ctrl + Shift + A查找编辑器里所有的动作
Ctrl + Tab在窗口间进行切换
View Code
posted @ 2019-01-11 12:49  Arthur666  阅读(1684)  评论(0编辑  收藏  举报