Head First Python---------(一)第一章(初识Python__人人都爱列表)、第二章(共享你的代码__函数模块)、第三章(文件与异常__处理错误)

movies=["The Holy Grail",1975,"TerrtJones&Terry Gilliam",91,["Graham Chapman",["Michael Palin",["huantianxidi","spring"],"John cleese",["People of name"],"Terry Gilliam","Eric Idle &TerryJones"]]];
#print(movies[4][1]);
#print(movies[4][1][1]);
#print(movies[4][0]);

print(movies);
print("一点点的改进,存在的问题是:第二层链表的嵌套,会把其中单个元素和元素为第三层链表嵌套的链表输出出来");
for each_item in movies:
    if isinstance(each_item,list):
        for item in each_item:
                 print(item);
    else:
        print(each_item);
#方法一:
print("\n最终的改进:所有元素,都一个一个的输出出来");
for each_item in movies:
    if isinstance(each_item,list):
        for item in each_item:
            if isinstance(item,list):
                for each in item:
                    print(each);
            else:
                 print(item);
    else: print(each_item);
    
#方法二:
    
print("\n又添加了配角所拍过的影片:所有元素,都一个一个的输出出来");
for each_item in movies:
    if isinstance(each_item,list):
        for item in each_item:
            if isinstance(item,list):
                for deeper in item:
                    if isinstance(deeper,list):
                        for deepermer in deeper:
                            print(deepermer);   
                        
                    else:
                        print(deeper);
            else:
                 print(item);
    else: print(each_item);
    
#方法三:
def print_lol(the_list):
    for each_item in the_list:
        if isinstance(each_item,list):
            print_lol(each_item);
        else:
            print (each_item);
#if __name__=='__main()__':
print("利用方法来实现movies中所有元素的输出:");
print_lol(movies);

以上是列表的相关学习代码。

实验结果:


二、升级版的列表输出(做到发现一个嵌套列表时就让它缩进)但存在问题,如果使用一个负值,实际上这会“关闭”缩进,因为“level”数不可能是一个负整数。这与(一)原来的输出非常相似。

代码如下:

在文件nester.py中:

'''这是"nester.py"模块,提供了一个名为print_lol()的函数,这个函数的作用是打印列表。其中有可能包含(也可能不包含)嵌套列表。'''
def print_lol(the_list,level=0):#level代表列表刚开始,缩进几个tab位,然后每层嵌套在前面缩进的基础上加1。向函数参数提供一个缺省值。
    '''这个函数取一个位置参数,名为"the_list",这可以是任何Python列表(也可以是包含嵌套列表的列表)。所指定的列表中的每个数据项
    会(递归地)输出到屏幕上,各数据项各占一行。'''
    for each_item in the_list:
        if isinstance(each_item,list):
            print_lol(each_item,level+1);
        else:
            for tab_stop in range(level):
                print("\t",end='');
            print (each_item);

在文件tab.py中:

import nester
movies=["The Holy Grail",1975,"TerryJones & Terry Gillian",91,["Graham",["Michael Palin","John Cleese","TerryGilliam","Eric Idle & TerryJones"]]];
print("\n缩进从指定的级别1开始:");
nester.print_lol(movies,1);#level代表列表刚开始,缩进几个tab位,然后每层嵌套在前面缩进的基础上加1。

print("\n缩进使用缺省值,级别为0:");
nester.print_lol(movies);#不再指定第二个参数,我们要依靠它的缺省值。

print("\n缩进从指定的级别2开始:");
nester.print_lol(movies,2);#缩进从指定的级别开始。
print("\n缩进从指定的级别-9开始:");
nester.print_lol(movies,-9);#如果使用一个负值,实际上这会“关闭”缩进,因为“level”数不可能是一个负整数。这与(一)原来的输出非常相似。

实验结果为:



三、最后的改进;

代码如下,

nester.py文件:

'''这是"nester.py"模块,提供了一个名为print_lol()的函数,这个函数的作用是打印列表。其中有可能包含(也可能不包含)嵌套列表。'''
def print_lol(the_list,indent=False,level=0):#level代表列表刚开始,缩进几个tab位,然后每层嵌套在前面缩进的基础上加1。向函数参数提供一个缺省值。
    '''这个函数取一个位置参数,名为"the_list",这可以是任何Python列表(也可以是包含嵌套列表的列表)。所指定的列表中的每个数据项
    会(递归地)输出到屏幕上,各数据项各占一行。'''
    for each_item in the_list:
        if isinstance(each_item,list):
            print_lol(each_item,indent,level+1);
        else:
            if indent:
                for tab_stop in range(level):
                    print("\t",end='');
            print (each_item);

tab.py文件:

import nester
movies=["The Holy Grail",1975,"TerryJones & Terry Gillian",91,["Graham",["Michael Palin","John Cleese","TerryGilliam","Eric Idle & TerryJones"]]];

print("\n缩进与否使用缺省值,默认不缩进:");
nester.print_lol(movies);#不再指定第二个参数,第三个参数,我们要依靠它的缺省值。

print("\n缩进使用缺省值,级别为0:");
nester.print_lol(movies,True);#level代表列表刚开始,缩进几个tab位,然后每层嵌套在前面缩进的基础上加1。

print("\n缩进从指定的级别2开始:");
nester.print_lol(movies,True,2);#缩进从指定的级别开始。

实验结果为:


三、文件的处理

3.1、依据某分隔符对每一行字符串的分隔,利用str.split()方法。


写help的参数时,要么写某方法所属的类名.方法,要么写已经定义了的某方法所属类的实例名,然后实例名.方法名;即help(类名.方法)或者help(实例名.方法名)。

当没有给定maxsplit参数时,代码如下:

import os
'''切换路径到文件所在的目录下
同时,引用os中的chdir方法时,不能直接写方法名,
因为chdir所属的命名空间是os,而不是当前主程序所属的命名空间__main__,
所以,正确的格式是,“方法所属的命名空间.方法名”'''

os.chdir("D:/pythontest/HeadFirstPython/chapter3/");

data=open("sketch.txt");
for each_line in data:
    (role,line_spoken)=each_line.split(':');
    '''split()这个可选参数控制着将数据行分解为多少个部分。
    默认地,数据会尽可能多地分解。如果将这个可选参数设置为1,
    数据行只会分解为两部分这实际上消除了数据行中额外的冒号的影响。'''
    
    print(role,end='');
    print(' said: ',end='');
    print(line_spoken,end='');
data.close();

运行结果为:


ValueError错误说明文件中 的数据又问题,是文件中的字符串内容所导致的,文件内容如下:

sketch.txt:

Man: Is this the right room for an argument?
Other Man: I've told you once.
Man: No you haven't!
Other Man: Yes I have.
Man: When?
Other Man: Just now.
Man: No you didn't!
Other Man: Yes I did!
Man: You didn't!
Other Man: I'm telling you, I did!
Man: You did not!
Other Man: Oh I'm sorry, is this a five minute argument, or the full half hour?
Man: Ah! (taking out his wallet and paying) Just the five minutes.
Other Man: Just the five minutes. Thank you.
Other Man: Anyway, I did.
Man: You most certainly did not!
Other Man:Now let's get one thing quite clearI most definitely told you!
Man: Oh no you didn't!
Other Man: Oh yes I did!
Man: Oh no you didn't!
Other Man: Oh yes I did!
Man: Oh look, this isn't an argument!
(pause)
Other Man: Yes it is!
Man: No it isn't!
(pause)
Man: It's just contradiction!
Other Man: No it isn't!
Man: It IS!
Other Man: It is NOT!
Man: You just contradicted me!
Other Man: No I didn't!
Man: You DID!
Other Man: No no no!
Man: You did just then!
Other Man: Nonsense!
Man: (exasperated) Oh, this is futile!!
(pause)
Other Man: No it isn't!
Man: Yes it is!

解决方案如下,先通过help查看split中有没有包含对你有帮助的功能、

发现,可以这么改,(role,line_spoken)=each_line.split(':',1);

修改后的结果为:


问题在于:

Man: You most certainly did not!
Other ManNow let's get one thing quite clearI most definitely told you!
Man: Oh no you didn't!
Other Man: Oh yes I did!
Man: Oh no you didn't!
Other Man: Oh yes I did!
Man: Oh look, this isn't an argument!
(pause)
Other Man: Yes it is!
Man: No it isn't!
(pause)
Man: It's just contradiction!
Other Man: No it isn't!
Man: It IS!

修改代码如下:(虽然程序可以正常工作了,但是代码有点脆弱。若文件的格式改变,代码也需要改变,而且更多代码通常

意味着更大的复杂性。增加额外代码来处理异常情况的做法确实可行,但是从长远来看这是有代价的。)

import os
'''切换路径到文件所在的目录下
同时,引用os中的chdir方法时,不能直接写方法名,
因为chdir所属的命名空间是os,而不是当前主程序所属的命名空间__main__,
所以,正确的格式是,“方法所属的命名空间.方法名”'''

os.chdir("D:/pythontest/HeadFirstPython/chapter3/");

data=open("sketch.txt");
for each_line in data:
        #if each_line.find(':')!=-1:
    if not each_line.find(':')==-1:
        (role,line_spoken)=each_line.split(':',1);
        '''split()这个可选参数控制着将数据行分解为多少个部分。
        默认地,数据会尽可能多地分解。如果将这个可选参数设置为1,
        数据行只会分解为两部分这实际上消除了数据行中额外的冒号的影响。'''
    
        print(role,end='');
        print(' said: ',end='');
        print(line_spoken,end='');
        #else:
        #print(each_line);
data.close();

实验结果为:


最最最优的改善:利用异常处理机制try/except

代码如下:

import os
'''切换路径到文件所在的目录下
同时,引用os中的chdir方法时,不能直接写方法名,
因为chdir所属的命名空间是os,而不是当前主程序所属的命名空间__main__,
所以,正确的格式是,“方法所属的命名空间.方法名”'''

os.chdir("D:/pythontest/HeadFirstPython/chapter3/");

data=open("sketch.txt");
for each_line in data:
    try:
        (role,line_spoken)=each_line.split(':',1);
        '''split()这个可选参数控制着将数据行分解为多少个部分。
        默认地,数据会尽可能多地分解。如果将这个可选参数设置为1,
        数据行只会分解为两部分这实际上消除了数据行中额外的冒号的影响。'''
    
        print(role,end='');
        print(' said: ',end='');
        print(line_spoken,end='');
    except:
        pass;
data.close();
分析:

不论调用split()方法时发生了什么,try语句会捕获所有异常并处理,用pass忽略这个错误。但是存在另一个当前代码所不能处理的

异常,即IOError,数据文件被删除而导致的问题。
实验结果为:


当所要读取的文件不存在时,在逻辑上处理改IOError的代码如下:

import os
'''切换路径到文件所在的目录下
同时,引用os中的chdir方法时,不能直接写方法名,
因为chdir所属的命名空间是os,而不是当前主程序所属的命名空间__main__,
所以,正确的格式是,“方法所属的命名空间.方法名”'''

os.chdir("D:/pythontest/HeadFirstPython/chapter3/");
#确定数据文件是否存在。
if os.path.exists('sketch.txt'):
    data=open("sketch.txt");
    for each_line in data:
      if not each_line.find(':')==-1:
            (role,line_spoken)=each_line.split(':',1);
            '''split()这个可选参数控制着将数据行分解为多少个部分。
            默认地,数据会尽可能多地分解。如果将这个可选参数设置为1,
            数据行只会分解为两部分这实际上消除了数据行中额外的冒号的影响。'''
    
            print(role,end='');
            print(' said: ',end='');
            print(line_spoken,end='');
        
    data.close();
else:
    print('The data file is missing!');

输出结果为:


方法二、利用异常处理来处理IOError异常:

import os
'''切换路径到文件所在的目录下
同时,引用os中的chdir方法时,不能直接写方法名,
因为chdir所属的命名空间是os,而不是当前主程序所属的命名空间__main__,
所以,正确的格式是,“方法所属的命名空间.方法名”'''

os.chdir("D:/pythontest/HeadFirstPython/chapter3/");
try:
    data=open("sketch.txt");
    for each_line in data:
        try:
            (role,line_spoken)=each_line.split(':',1);
            '''split()这个可选参数控制着将数据行分解为多少个部分。
            默认地,数据会尽可能多地分解。如果将这个可选参数设置为1,
            数据行只会分解为两部分这实际上消除了数据行中额外的冒号的影响。'''
    
            print(role,end='');
            print(' said: ',end='');
            print(line_spoken,end='');
        except:pass;
    data.close();
except:
    print('The data file is missing!');

实验结果为:


最后,针对特定异常的处理:(pass就是Python的空语句或者是null语句,它什么也不做)

代码如下:

import os
os.chdir("D:/pythontest/HeadFirstPython/chapter3/");
try:
    data=open('sketch.txt');
    for each_line in data:
        try:
            (role,line_spoken)=each_line.split(':',1);
            print(role,end='');
            print(' said: ',end='');
            print(line_spoken,end='');
        except ValueError:
            pass;
    data.close();
except IOError:
    print('The data file is missing!');
运行结果为:





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值