• Python 入门学习第二部分:模块、数据运算、列表、元祖和字典。


     

    声明:本文章是基于老男孩IT教育中Alex老师所上的课程的总结,所用内容基本上都引用自于Alex老师的课程以及他的博客http://www.cnblogs.com/alex3714/  在此十分感谢Alex老师的精彩课程,能够让我这个小白走上Python的学习道路。

    一、初识模块

       Pyhon具有非常丰富和强大的标准库与第三方库,几乎能实现你想要的任何功能。python中的模块分为两种类型,一种是标准库,不需要了另外安装,直接在写程序的时候通过import指令导入就行;还有一种是第三方库,必须要下载安装到对应的文件目录下,才能使用。具体的呢下面最下简单的介绍。

    1、两个例子

      1)Sysm模块

        当运行如下代码的时候,sys的path功能输出的结果是python 的全局环境变量,即python调用该模块时进行索引的路径。argv的功能则是打印模块的相对位置,同时可以用来调用参数。

    1 import sys
    2 print(sys.path)#打印环境变量
    3 print(sys.argv)

    2)os模块

    1 import os  #调用模块
    2 cmd_res1=os.system("dir") #system线路是让系统执行一条命令,但是这个命令只能执行不能储存
    3 cmd_res1=os.popen("dir").read() #popen线路就是可以储存的,但是这里在执行了之后实际上是相当于暂时放在内存的一个地方, #需要通过read()来调用出来,否则是一堆机器码
    4 print(cmd_res1)
    5 os.mkdir("new_dir")#这个用于创建一个新的目录,mkdirs则是用来创建一个新的多级目录。

    2、关于自己创建模块  

        最好不要用中文,另外要么放在和import的文件同一个目录下,要么放在前面提到过的site-packages里边,要么修改环境变量。
     
    还有在python3中有个问题:我们给Pyhon file命名的时候一定不要和模块的名字重到,否则Python会优先选择当前目录下的.py文件。
     
    二、关于pyc的一点小知识
       我们在之前的第一部分当中已经提到过,编程语言分为编译型语言和解释型语言。
       编译型语言在程序执行之前,先会通过编译器对程序执行一个编译的过程,把程序转变成机器语言。运行时就不需要翻译,而直接执行就可以了。最典型的例子就是C语言,java等。
       解释型语言就没有这个编译的过程,而是在程序运行的时候,通过解释器对程序逐行作出解释,然后直接运行,最典型的例子是Ruby,python等。
       然后我们又提到,两种类型的语言在运行速度、内存要求等方面具有一些不同的差异,同时呢随着技术慢慢慢慢地发展,两者之间的界限呢也变得越来越模糊。
       好了下面说回到python。
       当我们在命令行中输入python hello.py时,其实是激活了Python的“解释器”,告诉“解释器”:你要开始工作了。可是在“解释”之前,其实执行的第一项工作和Java一样,是编译。
         说编译可能不太确切,准确地说应该是预编译。当Python程序开始运行时,预编译的结果被储存在了内存中的PyCodeObject文件当中,当Python程序运行结束时,Python解释器则将PyCodeObject写回到pyc文件中。
       当Python程序第二次运行时,程序首先会在硬盘当中寻找pyc文件,如果能找到则直接载入,否则重复上面的过程。
      那么如果当源代码发生了更改之后该怎么办?Python在执行文件之前会预先搜索pyc文件,在找到之后,它会通过算法(C)对pyc文件的保存时间和源代码的更改时间进行比较,然后由此决定是否运行pyc文件。
        所以我们应该这样来定位PyCodeObject和pyc文件,我们说pyc文件其实是PyCodeObject的一种持久化保存方式。.pyc实际上是预编译后的自解码文件(15%的半成品)。
    三、数据类型
    简单介绍常用的几种数据类型。
     1、数字
       1)int(整型)
           在32位机器上,整数的位数为32位,取值范围为-2**31~2**31-1,
           即-21474836482147483647~21474836482147483647  
           在64位系统上,整数的位数为64位,取值范围为-2**63~2**63-1,        
           即-9223372036854775808~9223372036854775807
           另外,在Python3当中不存在整型和和长整型之分,只有整型。
       2)float(浮点型)
      浮点数用来处理实数,即带有小数的数字。类似于C语言中的double类型,占8个字节(64位),其中52位表示底,11位表示指数,剩下的一位表示符号。
    浮点的表示形式是小数,但浮点≠小数
    3.23和52.3E-4是浮点数的例子。E标记表示10的幂。在这里,52.3E-4表示52.3 * 10-4。
       3)complex(复数)
          复数由实数部分和虚数部分组成,一般形式为x+yj,其中的x是复数的实数部分,y是复数的虚数部分,这里的x和y都是实数。实际上就是所谓的可以用来表示三维空间当中的向量的一系列数。
     2、布尔值
      真或假
      1 或 0
      对--->true 1
      不对-->false 0
    3、字符串
     字符串的常用功能包括移除空白、分割、长度、索引、切片等,在后边的字符串操作部分中会详细介绍。
    四、数据运算
      1、算术运算
       常用的加减乘除,即“+”,“-”,“*”,“/”自不必多说。
       “%”,取模返回x的余数,可以应用于相邻两个单位不同的循环情况;
       “**”,幂 x**y即表示x的y次幂;
       “//”,取整除,返回商的整数部分
      2、比较运算
        >、<、<=、>=不多说。
       “!=”,不等于 
       “<>”,同上,不过不常用
       “==”等于
     3、赋值运算
      
    4、逻辑运算
    Python语言支持逻辑运算符,以下假设变量 a 为 10, b为 20
     
    5、身份运算
     
    例子如下:
    1 a=[1,2,3,4]
    2 print(type(a))
    3 type(a) is list

    这里最后的输出结果应该为“True”,即表明a确实是一个列表。

    6、二进制位运算

    计算机中能表示的最小单位,是一个二进制位;
    计算机中能存储的最小单位,是一个二进制位。(bit)
    8bit =1byte (字节)
    1024byte=1kbyte
    1024kbyte=1mbyte
    1024mb=1gb
    1024gb=1T
      
    7、关于各个运算的优先级
      
    五、入门知识拾遗
      1、三元运算
    1 a,b,c=3,6,7
    2 d=a if a<b else c
    3 print(d)
    4 #输出结果
    5 3

    2、进制

    • 二进制,01
    • 八进制,01234567
    • 十进制,0123456789
    • 十六进制,0123456789ABCDEF 

    二进制到十六进制的转化:

    http://jingyan.baidu.com/album/47a29f24292608c0142399cb.html?picindex=1

    十六进制的表示法:后缀为H——如BH表示十六进制数11
    前缀为0X——0x23表示16进制的23
    在进行从二进制到十六进制的转换过程中,
    在向左(或向右)取四位时,取到最高位(最低位)如果无法凑足四位,就可以在小数点的最左边(或最右边)补0,进行换算。
    3、bytes的数据类型
    在Python3当中,文本的unicode都有字符串数据(str)来表示;
    二进制的数据类型,诸如视频、音频等则都由bytes类型来表示。
    另外在Python3当中,所有的数据传输都采用二进制来进行。
    程序中string和bytes的转换示意图如下:
    msg="你大爷"
    print(msg.encode("utf-8"))
    print(msg.encode("utf-8").decode("utf-8"))

    比如上面的代码。

    在encode当中,一定要写明原先是哪一种数据类型,如果不写的话,默认是按照utf-8来进行。

    六、列表的使用
      1、列表的基本格式
    1 names=["a","b","c","d","e","b"]

    2、对于列表的对象查询

    1 print(names[3])#调用列表中的对象,从左到右依次为0,1,2,3...
    2 print(names[1:3])#切片,从左边开始的话,顾头不顾尾
    3 print(names[-1])#切片,调用最后一位,从右开始数
    4 print(names[-3:-1])#切片,按照从最后开始数的方法,但是切片还是从左往右并且顾头不顾尾的。
    5 print(names[-3:])#如果要取最后一位,那么:后边应该不写东西
    6 print(names[:2])#同理,如果说是从第一个开始,前面是0,也可以不写。
    7 print(names[0:-1:2])#跳着切片,最后一个2为步长

    3、对于列表的一些拓展功能的使用

     1)增加元素

    1 names.append("F")#添加元素到后边
    2 names.insert(1,"F")#添加元素到指定位置,想到那个位置就写那个位置的下标

    2)更改元素

    1 names[1]="B" #更改对应位置上的元素

    3)删除元素

    1 names.remove("c")#这种方式直接写要删除对象的内容
    2 del names[2]#这个就是指定位置下标来删
    3 names.pop(2) #pop和del起的作用其实基本是一样的,不过要是默认不写下标的话就会删除最后一个对象。

    4)查询元素

    1 print (names.index("c"))#对于已知内容的对象,打印其位置。
    2 print(names.count("b"))#打印相同对象在列表中出现的次数

    5)其他的一些

    1 names.clear()#清空整个表格
    2 names.reverse()#反转整个表格
    3 names.sort()#排序,按照ASCII码的顺序进行排列
    4 names2=["1","2","3"]
    5 names.extend(names2)#拓展表格
    6 print(names)

    6)关于list_.copy()的一些用法

      a.在只有一级列表的情况下,直接用copy是能够实现完全copy的,并且当names列表当中有元素变化时,names2是不会变化的。
    1 names=["a","b","c","d","e","b"]
    2 names2=names.copy()
    3 print(names)
    4 print(names2)
    5 
    6 #输出结果:
    7 ['a', 'b', 'c', 'd', 'e', 'b']
    8 ['a', 'b', 'c', 'd', 'e', 'b']

     b.在这里有两级列表,然后更改原始列表中的第一级的一个元素,names2当中并不会发生变化。

    names=["a","b","c",[1,2,3],"d","e","b"]
    names2=names.copy()
    names[1]="B"
    print(names)
    print(names2)
    
    #输出结果:
    ['a', 'B', 'c', [1, 2, 3], 'd', 'e', 'b']
    ['a', 'b', 'c', [1, 2, 3], 'd', 'e', 'b']

    c、但是看下边,当二级列表中的元素发生改变时,names2也变了。

    names=["a","b","c",[1,2,3],"d","e","b"]
    names2=names.copy()
    names[1]="B"
    names[3][1]=""
    print(names)
    print(names2)
    
    #输出结果:
    ['a', 'B', 'c', [1, '', 3], 'd', 'e', 'b']
    ['a', 'b', 'c', [1, '', 3], 'd', 'e', 'b']

     d、如果不使用copy,直接用前面的赋值:那么最后连最浅的一层也复制不了。

     1 names=["a","b","c",[1,2,3],"d","e","b"]
     2 names2=names
     3 names[1]="B"
     4 names[3][1]=""
     5 print(names)
     6 print(names2)
     7 
     8 #输出结果:
     9 ['a', 'B', 'c', [1, '', 3], 'd', 'e', 'b']
    10 ['a', 'B', 'c', [1, '', 3], 'd', 'e', 'b']

    e、上面的copy情况呢,就是所谓的浅copy,如果需要进行彻底的deepcopy,就需要调用copy模块。

     1 import copy
     2 names=["a","b","c",[1,2,3],"d","e","b"]
     3 names2=copy.deepcopy(names)
     4 names[1]="B"
     5 names[3][1]=""
     6 print(names)
     7 print(names2)
     8 
     9 #输出结果:
    10 ['a', 'B', 'c', [1, '', 3], 'd', 'e', 'b']
    11 ['a', 'b', 'c', [1, 2, 3], 'd', 'e', 'b']
    但是一般来说这种deepcopy不建议常用,因为毕竟有的时候有的列表动辄上万的数据量,如果完全复制一份,则会白白占据大量的空间,没必要。
     
    f.关于浅copy的应用,这里举一个例子,但是事先说一下,在实际生活中不是用这种方法来弄的。
      可以利用浅copy事先如下功能:
      创立一个多个人的共同账户,当一个账户的余额有变动时,其余的账户也跟着变动。
      
     1 import copy
     2 person=["name",["saving",100]]
     3 
     4 pres1=copy.copy(person)
     5 pres2=person[:]
     6 pres3=list(person)
     7 
     8 pres1[0]="Dad"
     9 pres2[0]="Mun"
    10 pres3[0]="Daughter"
    11 
    12 pres1[1][1]=50
    13 
    14 print(pres1)
    15 print(pres2)
    16 print(pres3)
    17 
    18 #输出结果
    19 ['Dad', ['saving', 50]]
    20 ['Mun', ['saving', 50]]
    21 ['Daughter', ['saving', 50]]
    View Code

     g、关于列表的循环

     1 names=["a","b","c","d","e","b"]
     2 for i in names:
     3     print(i)
     4 
     5 #输出结果:
     6 a
     7 b
     8 c
     9 d
    10 e
    11 b

    七、元组

    元组其实跟列表差不多,也是存一组数,只不过它一旦被创建,就不能更改。是一种只读语法。
    它有两个方法,一个是count,一个是index。
    在列表中也可以嵌套元组。
    1 names=("lilei","hanmeimei","xiaoming")

    八、购物车练习

       作业要求:创建一个购物车程序

    1. 启动程序后,让用户输入工资,然后打印商品列表
    2. 允许用户根据商品编号购买商品
    3. 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 
    4. 可随时退出,退出时,打印已购买商品和余额

    我初次编写的程序如下:

     1 money=int(input("Your salary:"))#需要改进:需要先判断输入的是否为数字,然后再进行转换,而非一开始就转换,,
     2 commodities=[[1,"iphone",int(5800)],[2,"mac book",int(10000)],[3,"Unicolo",int(200)],[4,"bicycle",int(2000)]]
     3    #需要改进:1、商品编号不够灵活  2、应该用嵌套模型,即元组。
     4 shoppingmart=[]
     5 while True:
     6   print(commodities)
     7   i=int(input("The code of what you want:"))
     8 
     9   if commodities[i-1][2]<=money:
    10      money=money-commodities[i-1][2]
    11      shoppingmart.append("{commodity},¥{price}".format(commodity=commodities[i-1][1],price=commodities[i-1][2]))
    12      print("Add {commodity} to your shopping cart!".format(commodity=commodities[i-1][1]))
    13      print("Your balance:",money)
    14   else:
    15      print("Your balance is insufficient!")
    16 
    17   question=input("Do you wanna quit?")
    18   if question=="Y":
    19       print("You have bought:",shoppingmart)
    20       print("Your balance:",money)
    21       break
    购物车程序1.0

    事实上上述程序存在如下问题:

      1、虽然能够实现输入编号选择商品,但不够灵活,加入商品增加并且商品名称、编号发生变化,那么会涉及到较大的改动。

      2、没有验证用户输入的数据类型以及输入的数据范围是否合理,一旦错误,程序就会报错导致无法运行。

      3、无法真正实现“随时都能退出”的要求。

     经过老师讲解后,程序改正如下:

     1 # Author DingRenpeng
     2 commodities=[
     3         ("iphone",5800),
     4         ("mac book",10000),
     5         ("Unicolo",200),
     6         ("bicycle",2000)
     7 ]
     8 shoppingmart=[]
     9 money=input("Your salary:")
    10 if money.isdigit():
    11    money=int(money)
    12    while True:
    13        for index,item  in enumerate(commodities):
    14            print(index,item)
    15 
    16        user_choice=input("The code of what you want:")
    17        if user_choice.isdigit():
    18            user_choice=int(user_choice)
    19            if user_choice<len(commodities) and user_choice>=0:
    20                p_item=commodities[user_choice]#这一步走的好啊,直接就定义了p_item是个嵌入的元组。
    21                if p_item[1]<=money:
    22                    shoppingmart.append(p_item)
    23                    money=money-p_item[1]
    24                    print("已添加%s至您的购物车,您的账户余额为33[31:1m%s33[0m"%(p_item,money))
    25                else:
    26                    print("33[41:1m您的余额只剩%s,无法支付本商品!33[0m"%money)
    27            else:
    28                print("您输入的编号不存在,请重新输入。")
    29 
    30        elif user_choice=="q":
    31           print("------购物车商品列表------")
    32           for shpping_item in shoppingmart:
    33               print(shpping_item)
    34           print("您目前的余额为%s"%money)
    35           exit()
    36 else:
    37   print("编号格式输入错误!请重启页面输入!")

    该表格的提升在于:

     1、使用了表格的嵌套模型;

     2、利用字符串操作 isdigit来判断输入的数据类型

     3、高亮部分直接定义了p_item为一个列表中的元祖,后边的列表扩展就显得很简单。

     4、没了。

    九、字符串操作

    具体所有的操作如下:

     1 name="MY name is Dingtou"
     2 print(name.capitalize())#首字母大写
     3 print(name.casefold())#大写全部变小写
     4 
     5 print("Dingtou".center(50,"-")) #保证打印出来满50个字符,不够用横线补足,前面字符放中间
     6                                   #输出结果:---------------------Dingtou----------------------
     7 print("Ding".count("D")) #统计某个字符出现次数
     8 print("Ding".encode()) #把字符串编译成bytes格式
     9 print("Ding".endswith("g") )  #判断是否以某个特定字符结尾,可用于判断邮箱是否以》com结尾
    10 print("Din	g".expandtabs(10) ) #输出“Din       g”,把	转化成此相昂应长度的空格
    11 print("My name is {name}".format(name="ding"))
    12 print("My name is {name},my age is {age}".format_map({'name':'ding','age':23}))#用于放入字典,但不常用
    13 
    14 print("Ding".index("i") ) #返回i在字符串里边的索引
    15 print("Ding123".isalnum() )#如果是数字或者字母,都能返回true
    16 print("Ding".isalpha() )#如果是数字,则返回true
    17 print("Ding".isdecimal() )#p判断字符串是否为十进制
    18 print("123".isdigit() )#如果全部为数字,则返回true
    19 print("Ding".isidentifier() )#判断是不是一个合法的标识符,就是一个合法的变量名
    20 print("ding".islower() ) #判断字符串是否全部为小写
    21 print("ding".isupper())#判断是否是全部大写
    22 print("Ding".istitle()) #判断是否为标题,即每个单词首字母大写
    23 print("+".join(['1','2','3']))#输出结果为’1+2+3‘
    24 print("Ding".ljust(50,"*"))#在右边用*补齐50
    25 print("Ding".rjust(50,"*"))#左边用*补齐50
    26 print("Ding".lower())#全部转化为小写
    27 print("Ding".upper())#全部转化为大写
    28 print("
    Ding".lstrip())#删除字符串左边的空格或回车
    29 print("Ding
    ".rstrip())#删除右边的空格或回车
    30 print("
    Ding
    ".strip())#删除两边的空格或回车
    31 
    32 p=str.maketrans("abcdefghijklmn","123456789!@#$%")
    33 print("Ding".translate(p))  #使用相应的密码来进行翻译  输出结果:D9%7
    34 print("Ding".replace("D","P"))#对字符串中的某个字符进行替换
    35 print("Ding Renpeng".replace("n","N",1))#数字表示想要替换当中的第几个目标
    36 print("Ding Renpeng".rfind('n'))#找到最右边对应字符的下标并返回
    37 print("1+2+3+4".split("+")) #输出结果按照括号中的对应字符进行列表的划分。 输出:['1', '2', '3', '4'
    38 print("Ding".swapcase()) #输出结果:dING rENPENG 大小写全部转化
    39 print("Ding tou".title())#转化为标题格式
    40 print("Ding".zfill(10)) #输出结果:000000Ding

    十、字典的使用

    1、字典的基本格式如下面代码所示:

       字典是无序的,不存在下标,因此打印出来的结果中,顺序也是随机的。

    1 #key-value
    2 info={
    3     "stu01":"Li lei",
    4     "stu02":"Hanmeimei",
    5     "stu03":"Lidan"
    6 }
    7 print(info)  

    2、增加对象

      下面的代码中,字典还是为上面已有的info。

    1 info["stu01"]="李雷"#修改
    2 info["stu04"]="Ding"#添加对象

    setdefult:

    检索看是否有key 如果有那么就返回这个key.如果没有就根据输入的value创建新的值

    比如下面代码:

    1 info.setdefault("stu01","李雷")
    2 print(info)
    3 #输出结果
    4 {'stu01': 'Li lei', 'stu02': 'Hanmeimei', 'stu03': 'Lidan'}
    5 
    6 info.setdefault("stu09","李雷")
    7 print(info)
    8 #输出结果
    9 {'stu01': 'Li lei', 'stu02': 'Hanmeimei', 'stu03': 'Lidan', 'stu09': '李雷'}

    3、删除对象

    1 del info["stu01"]
    2 info.pop("stu01")#也是删除
    3 info.popitem()#随机删

    4、更改对象内容

       首先是单个对象的更改:

    info["stu01"]="李雷"#修改

      下边是合并列表,并更新交叉的信息。

    1 b={
    2     "stu01":"Xiaogang",
    3     1:2,
    4     3:3
    5 }
    6 info.update(b)#合并并且更新交叉的信息
    7 print(info)

    5、查询对象

    1 print(info["stu01"])#这个在找不到的时候会报错
    2 print(info.get("stu05"))#正经查找,而且找不到的时候不会报错
    3 print("stu05" in info) #查询某对象是否处于列表当中,打印true or false

    6、关于item

       item 的作用是 把字典转化成为一个大的列表。

    1 print(info.items())#把字典转化成一个大的列表
    2 #输出结果
    3 dict_items([('stu01', 'Li lei'), ('stu02', 'Hanmeimei'), ('stu03', 'Lidan')])

    7、关于fromkeys

    1 c=dict.fromkeys([6,7,8],"Yo!")#初始化一个新的字典
    2 #输出结果
    3 {6: 'Yo!', 7: 'Yo!', 8: 'Yo!'}

      这里有一点需要提及的地方。看下面代码:

    1 d=dict.fromkeys([6,7,8],{"name":"Ding"})
    2 print(d)
    3 #输出结果
    4 {6: {'name': 'Ding'}, 7: {'name': 'Ding'}, 8: {'name': 'Ding'}}
    5 
    6 d[7]["name"]="Jack"
    7 print(d)
    8 #输出结果
    9 {6: {'name': 'Jack'}, 7: {'name': 'Jack'}, 8: {'name': 'Jack'}}

    我们发现当第二级的字典当中内容更改之后,整个最后输出的列表也改了,这其中的道理其实和前面提到的浅copy是一样的。

    8、字典的循环

    1   info={
    2     "stu01":"Li lei",
    3     "stu02":"Hanmeimei",
    4     "stu03":"Lidan"}
    5 for i in info:
    6     print(i,info[i])
    7 #或者
    8 for k,v in info.items():
    9     print(k,v)

    上面两种循环,看起来效果似乎是一样的,但是

    第二种方法涉及到了将字典转化成列表的过程,一旦数据量变大,会大大增加运算时间。因此一般不建议使用。
    9、多级嵌套
      具体代码如下,拷贝自Alex老师的博客。
      
     1 av_catalog = {
     2     "欧美":{
     3         "www.youporn.com": ["很多免费的,世界最大的","质量一般"],
     4         "www.pornhub.com": ["很多免费的,也很大","质量比yourporn高点"],
     5         "letmedothistoyou.com": ["多是自拍,高质量图片很多","资源不多,更新慢"],
     6         "x-art.com":["质量很高,真的很高","全部收费,屌比请绕过"]
     7     },
     8     "日韩":{
     9         "tokyo-hot":["质量怎样不清楚,个人已经不喜欢日韩范了","听说是收费的"]
    10     },
    11     "大陆":{
    12         "1024":["全部免费,真好,好人一生平安","服务器在国外,慢"]
    13     }
    14 }
    15 
    16 av_catalog["大陆"]["1024"][1] += ",可以用爬虫爬下来"
    17 print(av_catalog["大陆"]["1024"])
    18 #ouput
    19 ['全部免费,真好,好人一生平安', '服务器在国外,慢,可以用爬虫爬下来']
    View Code

     十一、这里有一个三级菜单的作业

       作业要求如下:

    • 三级菜单
    • 可依次选择进入各子菜单
    • 所需新知识点:列表、字典

    首先画出该作业的流程图,大致如下:

      

    具体代码如下:

     1 # Author DingRenpeng
     2 data={
     3     "江苏省":{
     4         "南京市":{"玄武区","秦淮区","建邺区"},
     5         "无锡市":{"崇安区","南长区","滨湖区"},
     6         "苏州市":{"姑苏区","吴中区","相城区"}},
     7     "浙江省":{
     8         "杭州市":{"西湖区","滨江区","萧山区"},
     9         "宁波市":{"海曙区","镇海区","慈溪市"},
    10         "温州市":{"鹿城区","龙湾区","瑞安市"}},
    11     "广东省":{
    12         "广州市":{"荔湾区","白云区","越秀区"},
    13         "深圳市":{"南山区","宝安区","盐田区"},
    14         "汕头市":{"龙湖区","金平区","潮阳区"}}
    15 }
    16 exit_flag=False
    17 
    18 while not exit_flag:
    19     for i1 in data:
    20         print(i1)
    21     choice1=input("请选择>>>")
    22     if choice1 in data:
    23         while not exit_flag:
    24           for i2 in data[choice1]:
    25             print(i2)
    26           choice2=input("请选择>>>")
    27           if choice2 in data[choice1]:
    28               while not exit_flag:
    29                 for i3 in data[choice1][choice2]:
    30                    print(i3)
    31                 choice3=input("请选择>>>")
    32                 if choice3 in data[choice1][choice2]:
    33                    choice4=input("选择完毕,请输入b返回或输入q退出")
    34                    if choice4=="b":
    35                       pass
    36                    elif choice4=="q":
    37                       exit_flag=True
    38                 if choice3=="b":
    39                     break
    40                 elif choice3=="q":
    41                     exit_flag=True
    42           if choice2=="b":
    43               break
    44           elif choice2=="q":
    45               exit_flag=True
    46     elif choice1=="q":
    47         exit_flag=True
    View Code

    整个三级菜单的程序当中:

    while循环 保证了当输入的不是对应内容的时候,不会出错,而是重新返回到一开始打印并要求输入的地方
    exit_flag=False,这个很有意思,也很巧妙,实现了在每一级都能退出程序的效果。
    (话说如果直接用exit会是什么效果??)结果发现 直接用exit()也能实现相同的功能啊~~~
    所以注意了:break用于退出循环,exit 用于退出程序。
     
     
    上面就是第二部分所学内容的整理与思考。
     
  • 相关阅读:
    【转】JSch
    【转】JSch
    【转】class卸载、热替换和Tomcat的热部署的分析
    关于Tomcat自动加载更新class的小技巧
    MySQL中order by中关于NULL值的排序问题
    MySQL触发器使用详解
    QuartZ Cron表达式
    JDBC的URL设置allowMultiQueries的原因
    CRT:C运行库简介
    IntelliJ IDEA安装AngularJS插件
  • 原文地址:https://www.cnblogs.com/dingtou00/p/6612280.html
Copyright © 2020-2023  润新知