• 小甲鱼Python第034讲:丰富的else语句及简洁的with语句| 课后测试题及参考答案


    测试题:

    0.在python中,else语句能跟哪些语句进行搭配呢?

      针对于三种情况可以进行搭配:

    • 要么怎样,要么不怎样 :if ... else ...
    • 干完了能怎样,干不完就别想怎样 :与循环语句(for 或者while)一起使用  
    • 没有问题,那就干吧: 异常处理 try... except ... else...  

    1.请问一下例子中,循环中的break语句会跳过else语句吗?

     1 def showMaxFactor(num):
     2     count = num//2
     3     while count >1:
     4         if num % count == 0:
     5             print("%d最大的约数是%d" % (num,count))
     6             break
     7         count -= 1
     8     else:
     9         print("%d是素数" % num)
    10         
    11 num = int(input("请输入一个数:"))
    12 showMaxFactor(num)

       会。因为如果将else语句与循环语句(for,while)进行搭配,那么只有循环正常执行后才会执行else语句块的内容。

    2.请目测一下代码会打印什么内容?

    1 try:
    2     print("ABC")
    3 except:
    4     print('DEF')
    5 else:
    6     print("GHI")
    7 finally:
    8     print("JKL")

       只有except语句中的内容不被打印,因为try语句块中并没有异常,则else语句块也会正常执行。

      ABC

      GHI

      JKL

    3.使用什么语句可以使你不必在担心文件打开后却忘记关闭的尴尬?

       with语句。

     1 # 正常打开关闭
     2 try:
     3     f = open("data.txt","w")
     4     for eachline in f:
     5         print(eachline)
     6 except OSError as reason:
     7     print("出错了,错误的原因是:" + str(reason))
     8 finally:
     9     f.close()
    10 # 自动打开和关闭---with语句
    11 try:
    12     with open("data.txt","w") as f:
    13         for eachline in f:
    14             print(eachline)
    15 except OSError as reason:
    16     print("出错了,错误的原因是:" + str(reason))

    4.使用with语句固然方便,但是如果出现异常的话,文件还会自动正常关闭吗?

       with语句会自动处理文件的打开和关闭,如果中途出现异常,会执行清理代码,确保文件自动关闭。

    5.你可以换一种形式写出下边的伪代码吗?

    1 with A() as a:
    2     with B() as b:
    3         suite

     伪代码:with语句处理多个项目的时候,可以用逗号隔开写成一条语句。

    1 with A() as a,B() as b:
    2     suite

    动动手:

    0.使用with语句改写成一下代码,让python去关心文件的打开与关闭吧。

     1 def file_compare(file1,file2):
     2     f1 = open(file1)
     3     f2 = open(file2)
     4     count = 0
     5     differ = []
     6 
     7     for line1 in f1:
     8         line2 = f2.readline()
     9         count += 1
    10         if line1 != line2:
    11             differ.append(count)
    12 
    13     f1.close()
    14     f2.close()
    15     return differ
    16 
    17 file1 = input("请输入需要比较的头一个文件:")
    18 file2 = input("请输入需要比较的头一个文件:")
    19 
    20 differ = file_compare(file1,file2)
    21 if len(differ) == 0:
    22     print("两个文件完全一样!")
    23 else:
    24     print("两个文件共有【%d】处不同:" % len(differ))
    25     for each in differ:
    26         print("第%d行不一样" % each)

        

     1 # 使用with语句修改代码,实现文件的自动打开和关闭
     2 def file_compare(file1,file2):
     3     with open(file1) as f1,open(file2) as f2:
     4         count = 0
     5         differ = []
     6         for line1 in f1:
     7             line2 = f2.readline()
     8             count += 1
     9             if line1 != line2:
    10                 differ.append(count)
    11         return differ
    12 
    13 file1 = input("请输入需要比较的头一个文件:")
    14 file2 = input("请输入需要比较的头一个文件:")
    15 
    16 differ = file_compare(file1,file2)
    17 if len(differ) == 0:
    18     print("两个文件完全一样!")
    19 else:
    20     print("两个文件共有【%d】处不同:" % len(differ))
    21     for each in differ:
    22         print("第%d行不一样" % each)

    1.你可以利用异常的原理,修改下面的代码使得更高效率的实现吗?

     1 print("|----欢迎进入通讯录程序----|")
     2 print("|----1:查询联系人资料----|")
     3 print("|----2:插入新的联系人----|")
     4 print("|----3:删除已有联系人----|")
     5 print("|----4:退出通讯录程序----|")
     6 
     7 contacts = dict()
     8 
     9 while 1 :
    10     instr = int (input("
    请输入相关的指令代码:"))
    11     if instr ==1:
    12         name = input("请输入联系人姓名:")
    13         if name in contacts:
    14             print(name +":"+ contacts[name])
    15         else:
    16             print("您输入的姓名不在通讯录中!")
    17 
    18     if instr == 2:
    19         name = input("请输入联系人的姓名:")
    20         if name in contacts:
    21             print("您输入的姓名在通讯录中已存在-->>",end = "")
    22             print(name +":"+contacts[name])
    23 
    24             if input("是否修改用户资料(YES/NO):") == "YES":
    25                 contacts[name ] = input("请输入用户联系电话:")
    26         else:
    27             contacts[name] = input ("请输入用户联系电话:")
    28 
    29     if instr == 3:
    30         name = input("请输入用户联系电话:")
    31         if name in contacts:
    32             del(contacts[name])
    33         else:
    34             print("您输入的联系人不存在。")
    35     if instr == 4:
    36         break
    37 
    38 print("|--感谢使用通讯录--|")

      使用条件语句是代码虽然简单明了,但是效率不高。因为程序会两次访问字典 的键,一次判断是否存在(eg:if name in contacts),一次获得值(eg: print(name + " :" +contacts[name]))。

      如果利用异常处理,我们可以简单避开每次需要使用in判断是否键存在字典的操作,因为只要当键不存在字典中时,会触发KeyError异常,利用此特性我们可以修改代码如下:

     1 print("|----欢迎进入通讯录程序----|")
     2 print("|----1:查询联系人资料----|")
     3 print("|----2:插入新的联系人----|")
     4 print("|----3:删除已有联系人----|")
     5 print("|----4:退出通讯录程序----|")
     6 
     7 contacts = dict()
     8 
     9 while 1 :
    10     instr = int (input("
    请输入相关的指令代码:"))
    11     if instr ==1:
    12         name = input("请输入联系人姓名:")
    13         try:
    14             print(name +":"+ contacts[name])
    15         except KeyError:
    16             print("您输入的姓名不在通讯录中!")
    17     if instr == 2:
    18         name = input("请输入联系人的姓名:")
    19         try:
    20             print("您输入的姓名在通讯录中已存在-->>",end = "")
    21             print(name +":"+contacts[name])
    22             if input("是否修改用户资料(YES/NO):") == "YES":
    23                 contacts[name ] = input("请输入用户联系电话:")
    24         except KeyError:
    25             contacts[name] = input ("请输入用户联系电话:")
    26     if instr == 3:
    27         name = input("请输入用户联系电话:")
    28         try:
    29             del(contacts[name])
    30         except KeyError:
    31             print("您输入的联系人不存在。")
    32     if instr == 4:
    33         break
    34 print("|--感谢使用通讯录--|")
  • 相关阅读:
    DFC-3C和DFC-3B的区别和注意事项
    Bug搬运工-CSCux99539:Intermittent error message "Power supply 2 failed or shutdown"
    EVE上传Dynamips、IOL和QEMU镜像
    EVE扩大虚拟内存
    EVE磁盘扩容
    VMware安装EVE
    介绍Mobility Group
    Bug搬运工-CSCvi02106 :Cisco 2800, 3800, 1560 APs: when connected to a Cisco Switch CDP-4-DUPLEX_MISMATCH log is seen
    jquery.autocomplete在火狐下的BUG解决
    nodeJS中exports和mopdule.exports的区别
  • 原文地址:https://www.cnblogs.com/IT-NXXB/p/13401533.html
Copyright © 2020-2023  润新知