测试题:
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("|--感谢使用通讯录--|")