可爱的python课后习题(二)

1,结合grep的实例,考虑处理子目录的情况:

#!/usr/bin/python
#coding=utf-8
#filename:cdcGrep.py
import os
def cdcGreper(cdcpath,keyword):
        filelist=os.listdir(cdcpath)
        for cdc in filelist:
                if os.path.isdir(cdc):
                        filename=cdcpath+os.sep+cdc
                        print '%s 是子目录 ' % filename
                        cdcGreper(filename,keyword)
                        print '执行迭代函数'
                elif '.txt' in cdc:
                        print '找到目标文件,准备读取'
                        cdcfile=open(cdcpath+os.sep+cdc)
                        for line in cdcfile.readlines():
                                if keyword in line:
                                        print line
if __name__=='__main__':
        cdc=cdcGreper('/home/zhouqian/python','test')
结果显示:

zhouqian@zhou:~/python$ python cdcGrep.py
找到目标文件,准备读取
./ ['class'] ['getoptTest.py', 'value_keys.py', 'text.txt', 'cdctool.py', 'test.txt', 'cdctoolTest.py', 'cdWalk.py', '.getoptTest.py.swp', 'cdWalk.pyc']

/home/zhouqian/python/class 是子目录 
找到目标文件,准备读取
test

test

test

执行迭代函数
找到目标文件,准备读取
test
说明下这里面友好多的print,是为了方便调试最笨的方法。
遇到问题总结:
os.sep是一个分割符的标志,
os.path.isdir是验证是否存在子目录的函数
迭代的巧妙运用,
in的使用:

>>> a='12345'
>>> 1 in a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'in <string>' requires string as left operand, not int
>>> '1' in a
True
>>> a=(1,2,3,4)
>>> 1 in a
True
>>> a=['1','2','3']
>>> 1 in a
False
>>> '1' in a
True
>>> a={1:11,2:33}
>>> 1 in a
True

习题2:编写类实现栈的功能----FILO:

#!/usr/bin/python
#coding=utf-8
#filename:MyStack.py
class MyStacker(object):
        '''
           mystack 自定义栈,主要的操作put(),get(),isEmpty()
        '''
        def __init__(self,max):
                '''初始化栈头指针和清空栈'''
                self.head=-1
                self.max=max
                self.stack=list()#这里使用list列表来存储数据
                for i in range(self.max):
                        self.stack.append(0)#这里是初始化stack的长度,也就是分配存储空间
        def put(self,item):
                #首先判断是否超出了栈的长度
                if self.head>=self.max:
                        return '栈已满,请先删除部分数据'
                else:
                        self.head+=1
                        self.stack[self.head]=item
                        print 'put %s successfully' %item
        def get(self):
                print '进入get函数中'
                if self.head<0:
                        return '栈已空,请先插入数据'
                else:
                        print '判断通过'
                        self.head-=1
                        print self.head
                        return self.stack[self.head+1]#此处这样写的目的是为了能够取到我们需要的那个数据,并且self.head还要减1
        def isEmpty(self):
                if self.head<-1:
                        print '该栈为空'
                        return True
                else:
                        print '该栈不为空,数据为%s' %self.stack
                        return False
if __name__=='__main__':
        mystack=MyStacker(10)
        mystack.put('a')
        mystack.put('chen')
        mystack.put('zhou')
        print mystack.get()
        print '##########'
        mystack.isEmpty()
        print mystack.get()

结果显示:

zhouqian@zhou:~/python$ python MyStack.py 
put a successfully
put chen successfully
put zhou successfully
进入get函数中
判断通过
1
zhou
##########
该栈不为空,数据为['a', 'chen', 'zhou', 0, 0, 0, 0, 0, 0, 0]
进入get函数中
判断通过
0
chen
遇到的问题总结:

实现FILO时选择数据结构:我们这里选择列表,主要是它能删能插,刚开始想用tuple的,可是它的数据在定义完后就没法在修改了。所以只能使用list来做

list的基本操作,检索的使用List 可以作为以 0 下标开始的数组。任何一个非空 list 的第一个元素总是 li[0]

python中类的使用注意事项。













你可能感兴趣的:(数据结构,python,String,list,object,存储)