作业31:
测试题:
0、pickle的实质是什么?
a.将对象数据以二进制形式保存在文件中
b.将对象数据以二进制形式从文件中读取
输入输出二进制流
1、使用pickle的什么方法存储数据?
dump()
2、使用pickle的什么方法读取数据?
load()
3、使用pickle能不能保存为”*.txt”类型的文件?
可以,后缀名可以任意指定,只不过用文本编辑器打开时,是乱码。
动动手:
0、编写一个程序,这次要求使用pickle将文件( record.txt (1.1 KB, 下载次数: 3988) )里的对话按照以下要求腌制成不同文件(没错,是第29讲的内容小改,考考你自己能写出来吗?):
解题思路:
小甲鱼的对话单独保存为boy_.txt的文件(去掉“小甲鱼:”)
小客服的对话单独保存为girl_.txt的文件(去掉“小客服:”)
文件中总共有三段对话,分别保存为boy_1.txt, girl_1.txt,boy_2.txt, girl_2.txt, boy_3.txt, gril_3.txt共6个文件(提示:文件中不同的对话间已经使用“==========”分割)
import pickle
file_name_base_boy = ‘boy_’;
file_name_base_girl = ‘girl_’;
file_count = 1;
#读取record文件
f_record = open(‘record.txt’,’r’);
file_name_boy = file_name_base_boy + str(file_count) + ".pkl";
file_name_girl = file_name_base_girl + str(file_count) + ".pkl";
fid_boy = open(file_name_boy,’wb’);
fid_girl = open(file_name_girl,’wb’);
boy_spoken = [];
girl_spoken = [];
for each_line in f_record:
print(each_line);
if each_line[:6]!=‘======‘:
[name,spoken]= each_line.split(‘:’,1);
if name == ‘小甲鱼’:
boy_spoken += spoken;
if name == ‘小客服’:
girl_spoken += spoken;
else:
pickle.dump(boy_spoken,fid_boy);
pickle.dump(girl_spoken,fid_girl);
fid_boy.close();
fid_girl.close();
boy_spoken = [];
girl_spoken = [];
file_count +=1;
file_name_boy = file_name_base_boy + str(file_count) + ".pkl";
file_name_girl = file_name_base_girl + str(file_count) + ".pkl";
fid_boy = open(file_name_boy,’wb’);
fid_girl = open(file_name_girl,’wb’);
else:
pickle.dump(boy_spoken,fid_boy);
pickle.dump(girl_spoken,fid_girl);
fid_boy.close();
fid_girl.close();
#验证代码
def read_pkl():
file_name_boy1 = ‘boy_1.pkl‘;
file_name_boy2 = ‘boy_2.pkl‘;
file_name_boy3 = ‘boy_3.pkl‘;
file_name_girl1 = ‘girl_1.pkl‘;
file_name_girl2 = ‘girl_2.pkl‘;
file_name_girl3 = ‘girl_3.pkl‘;
fid_boy1 = open(file_name_boy1,‘rb‘);
fid_boy2 = open(file_name_boy2,‘rb‘);
fid_boy3 = open(file_name_boy3,‘rb‘);
fid_girl1 = open(file_name_girl1,‘rb‘);
fid_girl2 = open(file_name_girl2,‘rb‘);
fid_girl3 = open(file_name_girl3,‘rb‘);
boy_spoken_1 = pickle.load(fid_boy1);
boy_spoken_2 = pickle.load(fid_boy2);
boy_spoken_3 = pickle.load(fid_boy3);
girl_spoken_1 = pickle.load(fid_girl1);
girl_spoken_2 = pickle.load(fid_girl2);
girl_spoken_3 = pickle.load(fid_girl3);
print(‘-------‘);
print(str(boy_spoken_1));
print(‘-------‘);
print(str(boy_spoken_2));
print(‘-------‘);
print(str(boy_spoken_3));
print(‘-------‘);
print(str(girl_spoken_1));
print(‘-------‘);
print(str(girl_spoken_2));
print(‘-------‘);
print(str(girl_spoken_3));
print(‘-------‘);
fid_boy1.close();
fid_boy2.close();
fid_boy3.close();
fid_girl1.close();
fid_girl2.close();
fid_girl3.close();
read_pkl();
作业32:
测试题:
0、结合你自身的编程经验,总结下异常处理机制的重要性?
增加程序处理错误的能力,提升用户体验。
1、请问以下代码是否会产生异常,如果会的话,请写出异常的名称:
>>> my_list = [1, 2, 3, 4,]
语法错误异常: SyntaxError
2、请问以下代码是否会产生异常,如果会的话,请写出异常的名称:
>>> my_list = [1, 2, 3, 4, 5]
>>> print(my_list(len(my_list)))
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
print(my_list(len(my_list)))
TypeError: 'list' object is not callable
3、请问以下代码是否会产生异常,如果会的话,请写出异常的名称:
>>> my_list = [3, 5, 1, 4, 2]
>>> my_list.sorted()
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
my_list.sorted()
# AttributeError: 'list' object has no attribute 'sorted'
4、请问以下代码是否会产生异常,如果会的话,请写出异常的名称:
>>> my_dict = {'host' : 'http://bbs.fishc.com', 'port' : '80'}
>>> print(my_dict['server'])
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
print(my_dict['server'])
# KeyError: 'server'
5、请问以下代码是否会产生异常,如果会的话,请写出异常的名称:
def my_fun(x, y):
print(x, y)
fun(x = 1, 2)
# 如果要指定参数需这样写:fun(x = 1, y = 2)。
# SyntaxError: positional argument follows keyword argument
6、请问以下代码是否会产生异常,如果会的话,请写出异常的名称:
f = open('C:\\test.txt', wb)
f.write('I love FishC.com!\n')
f.close()
# 异常:
Traceback (most recent call last):
File "I:\Python\小甲鱼\test003\test0.py", line 1, in <module>
f = open('C:\\test.txt', wb)
# NameError: name 'wb' is not defined
# 因为wb没加单引号,所以Python以为是变量,查找后发现没有定义。
7、请问以下代码是否会产生异常,如果会的话,请写出异常的名称:
def my_fun1():
x = 5
def my_fun2():
x *= x
return x
return my_fun2()
my_fun1()
# 异常:
Traceback (most recent call last):
File "I:\Python\小甲鱼\test003\test0.py", line 8, in <module>
my_fun1()
File "I:\Python\小甲鱼\test003\test0.py", line 6, in my_fun1
return my_fun2()
File "I:\Python\小甲鱼\test003\test0.py", line 4, in my_fun2
x *= x
# UnboundLocalError: local variable 'x' referenced before assignment
# Python认为在内部函数的x是局部变量的时候,外部函数的x就被屏蔽,所以执行x*=x时,根本找不到局部变量x的值。
作业33:
测试题:
0、我们使用什么方法来处理程序中出现的异常?
使用try方法,包括try-except语句和try-finally语句。
①try-except
try:
检测范围
except 异常类型 as e:
对应异常的处理程序
②try-finally
try:
检测范围
except 异常类型 as e:
对应异常的处理程序
finally:
无论如何都会执行的代码
1、一个try语句可以和多个except语句搭配?为什么?
可以,因为except可以和多种异常类型搭配,处理多种异常。
2、你知道如何统一处理多类异常吗?
使用except (Exception1, Exception2, Exception3…),这样只要是括号里出现的异常,都会执行except后的异常处理程序。
3、except后如果不带任何异常类,Python会捕获所有(try语句块内)的异常并统一处理,但小甲鱼不建议这么做,你知道为什么吗?
因为这样会屏蔽掉程序员未考虑到的异常,不利于程序的调试和维护,就算出错也不知道具体异常。
4、如果异常发生在成功打开文件后,Python跳到except语句执行,并没有执行关闭文件的命令(用户写入文件的数据就可能没有保存起来),因此我们需要无论如何(就算出了异常退出)文件也要被关闭,我们应该怎么做呢?
可以使用try-finally语句,在finally语句里f.colse()对文件进行关闭保存。
5、请恢复以下代码中马赛克挡住的内容,使得程序执行后可以按要求输出。
try:
for i in range(3):
for j in range(3):
if i == 2:
raise KeyboardInterrupt
print(i, j)
except KeyboardInterrupt:
print('退出啦!')
raise可以产生异常。
动动手:
0、还记得我们额小游戏吗?只要用户输入非整形数据,程序立刻就会蹦出不和谐的异常信息然后奔溃。请使用刚学的异常处理方法修改以下程序,提高用户体验。
import random
secret = random.randint(1,10)
i = 3
temp = input("猜一猜Allen心中的数字:")
number = int(temp)
while (i > 0):
if(number == secret):
print("哇,你是Allen肚里的蛔虫吗?")
print("奖励一个香吻!")
break
else:
if number > secret:
print("大了大了!")
else:
print("小了小了!")
if i > 1:
temp = input("哎呀!再猜猜看:")
number = int(temp)
i = i -1
print("游戏结束,不玩啦!")
修改后:
import random
secret = random.randint(1,10)
i = 3
temp = input("猜一猜Allen心中的数字:")
while True:
try:
number = int(temp)
except ValueError as reason:
print('类型出错啦\n' + str(reason))
break
number = int(temp)
while (i > 0):
if(number == secret):
print("哇,你是Allen肚里的蛔虫吗?")
print("奖励一个香吻!")
break
else:
if number > secret:
print("大了大了!")
else:
print("小了小了!")
if i > 1:
temp = input("哎呀!再猜猜看:")
number = int(temp)
i = i -1
print("游戏结束,不玩啦!")
break
这里加了2个break,主要是except语句处理后不会退出程序,而且还会报错NameError: name ‘number’ is not defined,所以做了改进。
1、input()函数有可能产生两类异常:EOFError(文件末尾endoffile,当用户按下组合键Ctrl+d产生)和KeyboardInterrupt(取消输入,当用户按下组合键Ctrl+c产生),再次修改上边的代码,捕获处理input()的两类异常,提高用户体验。
import random
secret = random.randint(1,10)
i = 3
while True:
try:
temp = input("猜一猜Allen心中的数字:")
number = int(temp)
except (ValueError, EOFError, KeyboardInterrupt) as reason:
print('类型出错:' + str(reason))
break
number = int(temp)
while (i > 0):
if(number == secret):
print("哇,你是Allen肚里的蛔虫吗?")
print("奖励一个香吻!")
break
else:
if number > secret:
print("大了大了!")
else:
print("小了小了!")
if i > 1:
temp = input("哎呀!再猜猜看:")
number = int(temp)
i = i -1
print("游戏结束,不玩啦!")
break
2、尝试一个新的函数int_input(),当用户输入整数的时候正常返回,否则提示出错并要求重新输入。程序实现如图:
def int_input():
while True:
try:
number = int(input('请输入一个整数:'))
break
except ValueError:
print('出错,您输入的不是整数!')
3、把文件关闭放在finally语句块中执行还是会出现问题,像下边这个代码,当前文件夹中并不存在“My_File.txt”这个文件,那么程序执行起来会发生什么事情呢?你有办法解决这个问题吗?
try:
f = open('My_File.txt') #当前文件夹中并不存在“My_File.txt”这个文件
print(f.read())
except OSError as reason:
print('出错啦:' + str(reason))
finally:
f.close()
出现异常,因为试图关闭一个不存在的文件对象
================== RESTART: I:\Python\小甲鱼\test003\test0.py ==================
出错啦:[Errno 2] No such file or directory: 'My_File.txt'
Traceback (most recent call last):
File "I:\Python\小甲鱼\test003\test0.py", line 7, in <module>
f.close()
NameError: name 'f' is not defined
修改后:
try:
f = open('My_File.txt') #当前文件夹中并不存在“My_File.txt”这个文件
print(f.read())
except OSError as reason:
print('出错啦:' + str(reason))
finally:
if 'f' in locals(): #如果文件对象变量存在当前局部变量符号表的话,说明打开成功
f.close()
作业34:
测试题:
0、在 Python 中,else 语句能跟哪些语句进行搭配?
if
while
with
except
1、请问以下例子中,循环中的 break 语句会跳过 else 语句吗?
def showMaxFactor(num):
count = num // 2
while count > 1:
if num % count == 0:
print(‘%d最大的约数是%d‘ % (num, count))
break
count -= 1
else:
print(‘%d是素数!‘ % num)
num = int(input(‘请输入一个数:‘))
showMaxFactor(num)
answer:会跳过
2、请目测以下代码会打印什么内容?
try:
print(‘ABC‘)
except:
print(‘DEF‘)
else:
print(‘GHI‘)
finally:
print(‘JKL‘)
打印结果:
ABC
GHI
JKL
3、使用什么语句可以使你不比再担心文件打开后却忘了关闭的尴尬?
with open as f:
....
#f.close(); #不要写,with调用完成时会清理当前对象
4、使用 with 语句固然方便,但如果出现异常的话,文件还会自动正常关闭吗?
可以,无论如何都会清理当前对象,文件还是会自动关闭。
5、你可以换一种形式写出下边的伪代码吗?
with A() as a:
with B() as b:
suite
方法1:
a = A()
if ‘a‘ in locals(): #以字典类型返回当前位置的全部局部变量
b = B()
if ‘b‘ in locals():
suite
方法2:with 语句处理多个项目的时候,可以用逗号隔开写成一条语句
with A() as , B() as b:
suite
动动手:
0、使用 with 语句改写以下代码,让 Python 去关心文件的打开与关闭吧。
def file_compare(file1, file2):
f1 = open(file1)
f2 = open(file2)
count = 0 # 统计行数
differ = [] # 统计不一样的数量
for line1 in f1:
line2 = f2.readline()
count += 1
if line1 != line2:
differ.append(count)
f1.close()
f2.close()
return differ
file1 = input(‘请输入需要比较的头一个文件名:‘)
file2 = input(‘请输入需要比较的另一个文件名:‘)
differ = file_compare(file1, file2)
if len(differ) == 0:
print(‘两个文件完全一样!‘)
else:
print(‘两个文件共有【%d】处不同:‘ % len(differ))
for each in differ:
print(‘第 %d 行不一样‘ % each)
def file_compare(file1, file2):
count = 0 # 统计行数
differ = [] # 统计不一样的数量
with open(file1) as f1, open(file2) as f2:
for line1 in f1:
line2 = f2.readline()
count += 1
if line1 != line2:
differ.append(count)
return differ
file1 = input(‘请输入需要比较的头一个文件名:‘)
file2 = input(‘请输入需要比较的另一个文件名:‘)
differ = file_compare(file1, file2)
if len(differ) == 0:
print(‘两个文件完全一样!‘)
else:
print(‘两个文件共有【%d】处不同:‘ % len(differ))
for each in differ:
print(‘第 %d 行不一样‘ % each)
1、 你可以利用异常的原理,修改下面的代码使得更高效率的实现吗?
print(‘|--- 欢迎进入通讯录程序 ---|‘)
print(‘|--- 1:查询联系人资料 ---|‘)
print(‘|--- 2:插入新的联系人 ---|‘)
print(‘|--- 3:删除已有联系人 ---|‘)
print(‘|--- 4:退出通讯录程序 ---|‘)
contacts = dict()
while 1:
instr = int(input(‘\n请输入相关的指令代码:‘))
if instr == 1:
name = input(‘请输入联系人姓名:‘)
if name in contacts:
print(name + ‘ : ‘ + contacts[name])
else:
print(‘您输入的姓名不再通讯录中!‘)
if instr == 2:
name = input(‘请输入联系人姓名:‘)
if name in contacts:
print(‘您输入的姓名在通讯录中已存在 -->> ‘, end=‘‘)
print(name + ‘ : ‘ + contacts[name])
if input(‘是否修改用户资料(YES/NO):‘) == ‘YES‘:
contacts[name] = input(‘请输入用户联系电话:‘)
else:
contacts[name] = input(‘请输入用户联系电话:‘)
if instr == 3:
name = input(‘请输入联系人姓名:‘)
if name in contacts:
del(contacts[name]) # 也可以使用dict.pop()
else:
print(‘您输入的联系人不存在。‘)
if instr == 4:
break
print(‘|--- 感谢使用通讯录程序 ---|‘)
print(‘|--- 欢迎进入通讯录程序 ---|‘)
print(‘|--- 1:查询联系人资料 ---|‘)
print(‘|--- 2:插入新的联系人 ---|‘)
print(‘|--- 3:删除已有联系人 ---|‘)
print(‘|--- 4:退出通讯录程序 ---|‘)
contacts = dict()
while True:
instr = int(input(‘\n请输入相关的指令代码:‘))
if instr == 1:
name = input(‘请输入联系人姓名:‘)
#if name in contacts:
try:
print(name + ‘ : ‘ + contacts[name])
except(KeyError):
#else:
print(‘您输入的姓名不再通讯录中!‘)
if instr == 2:
name = input(‘请输入联系人姓名:‘)
#if name in contacts:
try:
print(‘您输入的姓名在通讯录中已存在 -->> ‘, end=‘‘)
print(name + ‘ : ‘ + contacts[name])
if input(‘是否修改用户资料(YES/NO):‘) == ‘YES‘:
contacts[name] = input(‘请输入用户联系电话:‘)
except(KeyError):
#else:
contacts[name] = input(‘请输入用户联系电话:‘)
if instr == 3:
name = input(‘请输入联系人姓名:‘)
#if name in contacts:
try:
del(contacts[name]) # 也可以使用dict.pop()
#else:
except(KeyError):
print(‘您输入的联系人不存在。‘)
if instr == 4:
break
print(‘|--- 感谢使用通讯录程序 ---|‘)
作业35: