作业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、请恢复以下代码中马赛克挡住的内容,使得程序执行后可以按要求输出。

小甲鱼python课后题51 小甲鱼python课后题_Python

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(),当用户输入整数的时候正常返回,否则提示出错并要求重新输入。程序实现如图:

小甲鱼python课后题51 小甲鱼python课后题_python_02

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:

小甲鱼python课后题51 小甲鱼python课后题_python_03


小甲鱼python课后题51 小甲鱼python课后题_小甲鱼python课后题51_04


小甲鱼python课后题51 小甲鱼python课后题_python_05


小甲鱼python课后题51 小甲鱼python课后题_python_06


小甲鱼python课后题51 小甲鱼python课后题_python_07


小甲鱼python课后题51 小甲鱼python课后题_Python_08


小甲鱼python课后题51 小甲鱼python课后题_python_09


小甲鱼python课后题51 小甲鱼python课后题_小甲鱼python课后题51_10


小甲鱼python课后题51 小甲鱼python课后题_小甲鱼_11


小甲鱼python课后题51 小甲鱼python课后题_python_12


小甲鱼python课后题51 小甲鱼python课后题_Python_13


小甲鱼python课后题51 小甲鱼python课后题_小甲鱼_14


小甲鱼python课后题51 小甲鱼python课后题_小甲鱼python课后题51_15


小甲鱼python课后题51 小甲鱼python课后题_数据_16


小甲鱼python课后题51 小甲鱼python课后题_数据_17


小甲鱼python课后题51 小甲鱼python课后题_Python_18