Python3 入门

来源:互联网 发布:高伟光女朋友知乎 编辑:程序博客网 时间:2024/05/16 01:50
'''coding by Aris on 20140125#staffInfo.txt 文件内容如下ID    Name    Phone    Department001    Su Jin    13875412322    IT002    Aris    13403124431    Sale003    Jone Huang    13876541232    HR004    Aris    13423419345    IT'''#testStaffdef isMatch(fname):    import os    os.chdir(r'c:\Python34\Examples') #切换存放测试数据文件为当前工作目录    isExist=os.path.exists(fname) #所以输入的文件名字就不需要时绝对路径,短名就可以了    if isExist:        print ('I wil open',fname,'.')    else:        print ('Sorry. File is not exist.')        return False #判断文件是否存在,如果不存在 函数返回false 方便后面处理这种情况    def readFile(): #读取文件 因为不清楚文件大小,如果文件特别大,全部读入内存可能会造成可怕后果        with open(fname) as fin:            temp=fin.readline()            while temp:                yield temp #因此这里采用了生成器方式,按行一次读取每条记录                temp=fin.readline()    def Match(key): #使用闭包 后面详细解释        checkAns=[i for i in readFile() if key in i]        if len(checkAns)>0:            for c in checkAns:                print (c.strip())        else:            print ('No Match')    return Match #闭包的使用 返回函数 闭包有点类似类里面的成员函数def main():    print ('It is a test for python.')    fn=input('input file name:')    match=isMatch(fn)    if not match: #如果文件不存在 就退出 不执行后面操作        return -1    key=input('input your key string:')    while(key): #如果输入为空,退出循环        match(key)        key=input('input your key string:')if __name__ == '__main__': #入口    main()


因为python的理念“优雅”,“明确”,“简单”,“There should be one-- and preferably only one --obvious way to do it.” 我开始接触python。我使用的是python3.4的编译环境。因为网上还有很多教程上的实例都是基于2.x版本的。我个人感觉,很多地方都改变了。我大概说说我的经验。

这段代码是我在听一个视频教程,那个讲师留的一个作业,然后自己编写的程序。大概的意思就是,读取数据源里面的数据,简单起见,我就采用了文本保存数据源,然后建立简单的查询,查询是否存在相关的记录。

这段代码其实就是2个事情,1:读取记录,2:检索

p1:文件打开,可以是这样的 [伪代码,分号分隔语句]  f=open(fileName); while(!eof(f)):f.read();f.close();就是打开文件,在没读完文件之前,不停的读。但是根据“Only one way to do it” 对于文件这种打开后需要关闭的的“流”我采用 with.... as.... 语句。 如果你曾经用过VB,是否很眼熟。with.... as....结构的好处在于你不需要关心文件的关闭操作,在结束该语句块的作用域后,会自动帮你关闭文件。当然,你也可以在任何时候,添加close()语句,关闭文件。

p2:在读取记录的时候,采用了yield,制造了一个生成器。所谓生成器,其实就是一个迭代器,用来遍历。当然,一个做法是用readlines()读完整个文件,返回保存所有记录的一个列表。但是如果数据源文件很大,比如几十G之类,那就很可怕了。所以采用迭代器,使用的时候就可以遍历了。

p3:闭包。这段代码里面,Match和readfile这2个函数,是在isMatch函数内定义的。根据面向对象的概念,isMatch是父函数,Match和readfile是子函数。python里面,所有都是对象,包括函数本身,对象就有一个作用域。因为子函数在父函数内部定义,所以,子函数的作用域只仅限于父函数内部,同时,传递给父函数的变量,在父函数内部也是有效的,所以,所谓的闭包,就是子函数可以使用父函数的参数。

p4:再看这个闭包实例的作用,相当于实现了一个类的功能。比如实现isMatch函数的功能,可以建立一个类,比如 class IsMatch 其中,有一个私有成员,fname还有一个私有的成员函数readfile和公共成员函数match。传递给isMatch参数fname,相当于用fname构造函数的参数,实例化IsMatch类。闭包中的语句match=isMatch(fn)就相当于用fn实例化了IsMatch类。然后,isMatch函数最后返回的是Match函数,所以此时match就相当于isMatch闭包里面的Match函数,需要传递参数key。类似于使用IsMatch类中的公共函数Match。

p5:列表解析。搜索记录中是否包含有关键字的代码用了一句 checkAns=[i for i in readFile() if key in i] 返回一个列表。这个语句相当于

num=0for line in readfile():        line=line.strip()        words=line.split('\t')        if words.count(key)>0:        print (line)        num+=1if num==0:        print ('No Match')
python中列表的功能是很强大的。利用列表可以完成函数返回多个值,同时命名等。比如,给变量i,j分别赋值为1,2,可以这样写

i,j=1,2
很多时候,我们需要用swap函数,就是交换2个变量的值,python中可以直接交换,比如交换i和j的值,可以直接这样写
i,j=j,i
p6:就好象c++中的main函数一样,执行一段python代码,需要一个入口函数,python中的入口函数就是
if __name__ == '__main__': #入口    main()
以上是我的拙见,有不对的地方,恳请指教




0 0
原创粉丝点击