首页 > > > 可爱的python.pdf.pdf

可爱的python.pdf.pdf

可爱的python.pdf.pdf

上传者: Bugac 2014-02-18 评分1 评论0 下载1 收藏10 阅读量851 暂无简介 简介 举报

简介:本文档为《可爱的python.pdfpdf》,可适用于软件工程领域,主题内容包含实例故事|实例故事RealyTasteStorys笔者自年接触Python到现在一直对Python的兴趣和信心有增无减。但Python在中国还处于推符等。

实例故事 | 1 实例故事 Realy Taste Storys 笔者自 2000 年接触 Python 到现在,一直对 Python 的兴趣和信心有增无减。 但 Python 在中国还处于推广普及的发展阶段。回想自己的学习体会,基本 是从“不知己不知”到“不知己知”,再到“知己知”,最后“知己不 知”。具体来说是开始涉及一个全新技术领域时,不知道这个领域的任何 信息,连“不知道什么”都没有概念;后来,通过各种途径获得了部分相 关信息,但不知道自个儿已经知道了哪些实用信息。再后来,通过实践切 实掌握了领域的基础知识,明确在领域内掌握了什么;最后,掌握了领域 间的关系,明白自己究竟还有多少知识不知道。感觉只有快速达到“知己 知”的阶段,才可能事半功倍地继续学习下去。 我想把自己的这种学习体验与心得与大家分享,但怎么向那些没有摸到 Python 秉性的人们宣传这种体验呢?developerWorks 中 David Mertz 创 作的“可爱的 Python”系列也就成了本书的原型结构。(访问地址: http://www.ibm.com/developerworks/cn/linux/theme/special/index.html#python, 精巧地址:http://bit.ly/mfUT) 下面两个以解决实际问题为出发点,有剧情有人物的小白成长故事,将 Python 最可爱的方面,以小篇幅的轻松形式组织起来!希望读者可以跟随 小白轻松体验到 Pythonic。 2 | CDays“光盘故事” CDays“光盘故事” CDay5 Python 初体验和原始需求 3 CDay4 可用的首个 Python 脚本 9 CDay3 通过函式进行功能化 16 CDay2 完成核心功能 22 CDay1 实用化中文 31 CDay0 时刻准备着!发布 41 CDay+1 优化!对自个儿的反省 46 CDay+2 界面!不应该是难事儿 54 CDay+3 优化!多线程 69 CDayN 基于 Python 的无尽探索 75 CDays“光盘故事” | 3 CDay5 Python初体验和原始需求 Just use it! don't learn!——只用,不学! 剧本背景 本书采用实例故事的形式来讲解 Python,所谓实例故事,就是设计一个具体情景,让代 表读者的初学者,同代表作者的行者沟通,从而完成学习过程,在过程中引导式地给读 者展示 Python 的乐趣;当然读者不一定什么都不知道,作者也可能高明不到哪里去,但 是,有个具体的事,讲起来就更有针对性一些。 好的,这就开始。依照传统说书的方式,先来个定场诗活跃一下气氛。 左咖啡,右宝石;还是灵蟒最贴心! 最贴心,不费心,用好只须听故事。 想清楚,就清楚,一切自己来动手! 要清爽,常重构!刚刚够用是王道! 下面正式开场。 人物介绍 书中会涉及两个人物,一个是小白,一个是行者,他们分别代表—— 小白: 没有或是仅有一点编程体验的好奇宝宝,想快速上手使用 Python 解决实际问题。 4 | 实例故事 行者: 啄木鸟/CPyUG 等中国活跃 Python 社区的热心 Python 用户,说话可能有些颠三倒四, 但是绝对都是好心人。 约定 下面是本书所使用的一些体例约定。 列表: 指的是邮件列表——一种仅仅通过邮件进行群体异步交流的服务形式,是比 BBS 更加 古老和有效的沟通方式。 小结: 在每日故事讲完之后会通过小结的方式,将当日故事情节中涉及的知识点和领域技术 进行集中简述,以便读者明确要点。 练习: 每日故事的最后一节内容,虽然它所包含的问题和故事内容可能没有太大关联,但是 这些问题必须使用前述涉及的知识点和领域技术才可以解决,所以特别列出,建议读者 独立进行尝试,加强对相关知识的理解。 习题解答发布在图书维基: http://wiki.woodpecker.org.cn/moin/ObpLovelyPython/LpyAttAnswerCdays 精巧地址:http://bit.ly/XzYIX 用 SVN 下载: http://openbookproject.googlecode.com/svn/trunk/LovelyPython/exercise/part1-CDays/ 事件 小白忽然厌烦了不断地下载安装、破解,却总是找不到称心软件的生活: “烦人! 什么破软件这么不好使,还要 150$!!! 我!要!自个儿写!” 邮件列表有古老的规范和格 式。访问地址: http://www.woodpecker.org. cn/share/classes/050730- CPUG/usMaillist/ 精巧地址: http://bit.ly/43WKcR CPyUG社区有丰富的列表 资源。 访问地址: http://wiki.woodpecker.org. cn/moin/CPUGres 精巧地址: http://bit.ly/vrqUk CDays“光盘故事” | 5 发动 究竟怎么回事儿呢?小白到列表中一说,大伙这才明白,原来他买了台刻录机,于是没 日没夜地进行 eMule 的下载,才一个月刻录出来的光盘就有了上百张,结果,当他想找 回一个专辑的 MP3 时,却遍寻不着……所以他想要一种工具,不用插入光盘就可以搜索 所有光盘的内容。就这么简单的一个愿望,可是咋就找不到好用的软件呢?!这才有了上述 那一幕。 Python! OK!你们都说 Python 好用,我就来尝试一下吧! 我是菜鸟我怕谁?! 运行环境: 推荐 ActivePython,虽然此乃商业产品,却是一个有自由软件版权保证的完善的 Python 开发应用环境,关键是文档及相关模块的预设都非常齐备。在 GNU/Linux 环境中,当然 推荐使用原生的 Python.org,主流的自由操作系统发行版都内置了 Python 环境;对应的 软件仓库中都有合适的 Python 版本可以选择,安装和使用也非常方便。 好了,下载、安装吧…… Hello World! “Hello World”非常非常著名,但凡是编程语言,第一课都要玩这个例程,下面我们也 看一看 Python 的,如图 CDay5-1 所示! 图 CDay5-1 Hello World 示例 再展示一个类似的,但是推荐的体验环境为 iPython,如图 CDay5-2 所示。 PCS3 “交互环境之winpy” 含有关于 ActivePython 的 简介,网址为: http://www.activestate.com /Products/ActivePython/ ActiveState 是商业公司,但 是对自由软件支持良多。 Python.org 的网址为: http://www.python.org/ download/ 它是 Python 语言本身的大 本营。 P C S 3 PCS2“交互环境之 iPython”,相关网址为: http://ipython.scipy.org/ iPython 是个融合了N多 Unix Shell 环境特质的 Python 交互式命令行环 境,推荐使用,你会爱上 Tab 键的。 P C S 2 6 | 实例故事 图 CDay5-2 Hello World 示例(iPython) 就是这么简单,告诉 Python 打印“Hello World!”就行了。 所以说,对于 Python,可以只用不学! 文档 丰富的文档可以安抚我们面对未知的恐惧,推荐深入阅读以下资料,但是不推荐现在就 全面阅读。 Python Tutorial——Python 教程中文版本 在线访问:http://wiki.woodpecker.org.cn/moin/March_Liu/PyTutorial 精巧地址:http://tinyurl.com/6h2q7g 这是 CPyUG(Chinese Python User Group)中国 Python 用户组的资深专家刘鑫长期维护 的一个基础文档,也是 Python 创造者 Guido.van.Rossum 唯一亲笔撰写的技术文档! A Byte Of Python——简明 Python 教程 在线访问:http://www.woodpecker.org.cn/share/doc/abyteofpython_cn/chinese/index.html 精巧地址:http://tinyurl.com/5k8pv5 这是由沈洁元翻译的一篇流传甚广的学习 Python 的小书,从初学者的角度快速说明了一 些关键知识点。原作者是印度的一位年轻的程序员,大家可以到这本书的网站直接和作 者沟通:http://www.swaroopch.com/byteofpython/。 Python 标准库的中文版 在线访问:http://www.woodpecker.org.cn/share/doc/Python/_html/ PythonStandardLib/ 精巧地址:http://tinyurl.com/5pmvkn 由“Python 江湖 QQ 群”全体成员共同完成,Python 2.0 内置所有标准模块的说明,是 CDays“光盘故事” | 7 初学者开发过程中必备的参考。 ASPN——Python Reference~Activestate 公司 Python 参考资料汇总 在线访问:http://aspn.activestate.com/ASPN/Python/Reference/ 精巧地址:http://tinyurl.com/58t3sl 原始需求 安装好了 Python 环境,在行者的指点下又收集了一批资料的链接,下面小白想真正开始 软件的创造了。但是,行者又告诫道: “明晰你的问题,当问题真正得到定义时,问题已经解决了一半。因为,程序不过是将 人的思想转述为机器可以理解的操作序列而已;对于寻求快速解决问题,而不是研究问 题的小白和 Pythoner 们,精确、恰当地描述问题,就等于写好了程序框架,余下的不过 是让程序可以运行罢了。” 于是小白根据直觉将软件需求细化了一下: 不用插入光盘就可以搜索所有光盘的内容,等于说…… 要将光盘内容索引自动储存到硬盘上 要根据储存到硬盘上的光盘信息进行搜索 就这两点,也仅此两点的需求,可以如何以及怎样通过 Python 实现?小白和读者一同期 待…… 小结 作为开始,今天小白决定使用 Python 来解决光盘内容管理这一实际问题,安装了 python 环境,运行了“Hello World!”实例。 OK!轻松的开始,但是,你知道你同时也获得了免费的绝对强大的科学计算器吗? 练习 1. 计算今年是否是闰年。判断闰年条件,满足年份模 400 为 0,或者模 4 为 0 但模 100 不为 0。 8 | 实例故事 2. 利用 Python 作为科学计算器的特性,熟悉 Python 中的常用运算符,并分别求出: 1) 12*34+78132/6 2) (12*(34+78)132)/6、(86/40)**5,并利用 math 模块进行数学计算,分 别求出: 145/23 的余数 0.5 的 sin 和 cos 值(注意 sin 和 cos 中的参数是弧度制表示法) 提示:可通过 import math; help("math")查看 math 帮助。 3. 找出 0~100 的所有素数。 CDays“光盘故事” | 9 CDay4 可用的首个 Python脚本 寻找吧!不要先想着创造——Python是自足的。 现在的需求 小白根据曾经下载过的几个类似商业软件名称,给自个儿的软件起了个名字,叫 “PyCDC”,即 Python 制作的光盘收集器(CD Collector),或者命令工具(CD Commander)。 再次确认当前的需求: 1. 将光盘内容索引储存为硬盘上的文本文件; 2. 可以根据储存到硬盘上的光盘信息进行搜索。 因为小白痛恨数据库(只能通过神奇的 SQL 语句才能调动数据库中的数据,太不直观, 太不人性化了!),所以这第一个需求是将光盘信息读取为文本文件。 文件是系统的事儿 现在首要问题是“如何读取指定光驱中的文件列表信息?” 行者仅仅给了一条批示:文件是系统的事儿。 listdir() 系统 操作系统 operating system os模块 10 | 实例故事 呜乎!小白搜索了一大圈才弄明白什么叫“系统”,而且找到了相应的“模块”。 在《简明 Python 教程》的第 14 章“Python 标准库——os模块”中看到一句话:os.listdir() 返回指定目录下的所有文件和目录名。 看起来可以利用这个函数,所以,创建第一个执行脚本 CDay4-1.py: # -*- coding: utf-8 -*- import os print os.listdir("/media/cdrom0") 代码注解: 1. # -*- coding: utf-8 -*-应该像八股文一样在每个脚本的头部声明,这是个忠告 ——为了解决中文兼容问题,同时你应该选择支持 Unicode 编码的编辑器环境,保 证在运行脚本中的每个汉字都是使用 utf-8 编码过的。 2. import os 就是告诉 Python 环境,我们要使用 os 模块,依此类推,如果你想使用 任何己有的模块包,就使用“import 模块名”的形式引用。 3. 最后一行才是我们真正想做的事儿:打印光盘根路径中的所有文件和目录。 同时,小白也进一步了解了什么是脚本,为什么会有脚本。 因为 Python 程序不用编译,它是人写的程序文件,可以直接执行,就像话剧脚本一样, 所以也称 Python 程序文件为脚本。在交互式命令行环境中,固然可以立即获得执行结果, 但是在尝试过程中的各种程序代码无法被记忆下来,所以,事先写好脚本很重要,使用 运行命令“python 脚本名.py”的形式就可以反复执行所有代码行。脚本是 Python 丰富 的运行形式之一,也是最常用的一种。 上面的脚本运行结果类似图 CDay4-1: 图 CDay4-1 使用脚本运行 当然在 iPython环境下,逐步运行也一样,如图 CDay4-2 所示。 图 CDay4-2 iPython中运行 以上截屏输出是使用 Ubuntu 6.06 安装光盘来测试的结果,当然,小白使用进一步的目录 PCS200 “os(.stat; .path)” 中对 os 模块有进一步细节 描述。 《简明 Python 教程》的第14 章“Python标准库”的访问地 址:http://www.woodpecker. o r g . c n / s h a r e / d o c / abyteofpython_cn/chinese/ ch14s03.html 精 巧 地 址 : http://bit.ly/ 2F1XXY P C S 2 0 0 PCS5“Python 脚本文件” 中进一步说明了脚本文档在 各种操作系统中的表现,以 及基础性的知识。 P C S 5 CDays“光盘故事” | 11 时,os.listdir()的确可以报告指定目录的所有信息,但是,问题是如何自动地将整个 光盘中的所有文件和目录信息都“一次性地扫描”出来? 当然,自个儿写一个是可以的,不过这只是根据每级目录的信息再次不断调用 os.listdir(),将所有层次的目录信息都逐一汇报出来而已,这样做值得吗?小白的热 情是非常容易被看来很麻烦的代码实现击碎的……于是热心的无所不能的行者又提了 句:“使用 walk()”。 提示:笔者使用 Ubuntu 系统,对于文件系统的使用和小白所使用的 Windows 系统稍有 不同:Ubuntu 没有分区的概念,光盘一般会自动统一地挂接到 /media/cdrom0 目录,而小 白则可以自由地使用 G:\等类似的盘符进行替换。放心,Python 足够聪明,它是跨平台的。 须要提醒的是,Windows 中最好使用 d:\\进行分区的指定。否则,会出现类似 d:/tmp\ something 的混合输出。 walk 一阵乱搜后,发现居然有个单独的模块 os.path是进行文件路径处理的! 再一搜索英文,发现: Note: The newer os.walk() generator supplies similar functionality and can be easier to use. 好像在我们的环境中有两个 walk():os.path.walk()和 os.walk(),是不是后一个更新, 也更好用? 按照 os-file-dir的示例改造脚本,尝试 CDay4-2.py: 1 # -*- coding: utf-8 -*- 2 import os 3 for root, dirs, files in os.walk('/media/cdrom0'): 4 print root,dirs,files 然后,按照脚本运行方式尝试:~$ python CDay4-2.py... 哇!一下子输出了一大堆的 东西!看来管用,应该是将整个光盘的文件/目录信息都扫描出来了。 PCS2 “交互环境之 iPython” 详细说明了加强的交互命令 行界面 iPython 的甜美;简要 地说 iPython 是 Python 原 生交互环境的加强,追加了很 多纯正 Unix 风味的响应特 性。 P C S 2 Ubuntu 是最流行的 GNU/Linux 发行版。 官方网站: http://www.ubuntu.com/ 中文官方网站: http://www.ubuntu.org.cn/ PSC200“os(.stat; path)”含 有 os 模块进一步细节,其中 os.path()函式的详细说明可 在线查阅。 访问地址: http://aspn.activestate.com/ ASPN/docs/ActivePython/2. 4/python/lib/module-os.path .html 精巧地址: http://bit.ly/2XD0k0 P C S 2 0 0 PCS4“常用自省”中详细介 绍了最常用的几个Python 内 建函式,它们可以通过自省的 方式来快速对Python 进行查 询,寻找想要的处理支持。 P C S 4 panzhizhou 附注 首先我的做法就是把u盘当作cd,然后想把u盘里面的信息读出来,并作索引,但是目前是读出来的中文显示乱码,这里关于编码的部分还需要解决!! 12 | 实例故事 不管三七二十一,先保存为文件! 输出成文件 小白根据行者的指引,同时也进行了搜索,了解了 file_objects文件对象操作相关知识, 然后自己加了点儿想象就组成了以下脚本 CDay4-3.py: 1 # -*- coding: utf-8 -*- 2 import os 3 for root, dirs, files in os.walk('/media/cdrom0'): 4 open('mycd.cdc', 'a').write(root+dirs+files) 尝试执行~$python CDay4-3.py,如图 CDay4-3 所示。 图 CDay4-3 初步 CDay4-3.py脚本运行结果 完了!报错!……小白感觉信心又降到了冰点。“呵呵”,行者说,“不用担心,在 Python 中 想要解决 bug 是非常轻松的,因为它有完善的回溯能力。Python 可以非常精确地汇报小 白出错的时间、地点、原因,我们只要对应修订就行了。” 现在的问题是: TypeError: cannot concatenate 'str' and 'list' objects 也就是说,不能将 str 和 list 对象进行连接。这是非常直白的数据类型错误。 什么是“数据类型”?这问题可以复杂地解释,也可以简单地说。复杂的解释并不能帮 助小白理解和记忆,简单的说也不一定能加深印象。通俗地讲呢,就是计算机内存空间 中有不同的种族,好比鸡鸭同笼,长的都挺像,但是没有办法卖相同的价钱,除非都剁 碎了炸成春卷——也就是说只要发生类似数据类型时,把它们转换成相同的类型就得了! 这种方式对于其他语言来说可能会很麻烦,但是在 Python 中是再简单不过的了。因为, Python 里一切都是对象。 讨教行者后,他们给了个样例: print "%s %s %s %s" % ("字串",["数","组"],("元","组"),{'字典':123}) 如果小白有 C 编程经验立即就可以联想到这是输出格式化的技巧,使用%s的格式化声明, 要求后面的对象以 String 字串的格式进行转换,所以脚本 CDay4-4.py 的改造也就顺理 PCS200“os(.stat; .path)” 中有 os 模块的进一步细节 描述,其中 os-file-dir 可 以在线查阅: http://aspn.activestate.com /ASPN/docs/ActivePython/ 2.4/python/lib/os-file-dir. html 精巧地址: http://bit.ly/eJj4f P C S 2 0 0 PCS200 “os(.stat; .path)” 中对 os 模块有进一步的细 节描述,其中 file_objects 可以在线查阅: http://www.woodpecker.org.cn/ diveintopython/file_handling/ file_objects.html 精巧地址: http://bit.ly/1e41SW P C S 2 0 0 “Python 里一切都是对象” 是理解应用 Python 的关键 之一,详细内容请参考《万 物皆对象》: http://www.woodpecker.org. cn/diveintopython/getting_to _know_python/everything_ is_an_object.html 精巧地址: http://bit.ly/2tiwrd PCS102 “For 循环”进一 步说明了小白首次遇见的新 语法现象;这也是一切程序 中最基本的反复运行相似语 句的技巧。 P C S 1 0 2 CDays“光盘故事” | 13 成章了 : 1 # -*- coding: utf-8 -*- 2 import os 3 for root, dirs, files in os.walk('/media/cdrom0'): 4 open('mycd.cdc', 'a').write("%s %s %s" % (root,dirs,files)) 代码注解: 1. 声明是 utf-8 编码文本; 2. 引入了 os 模块; 3. 使用 os.walk() 扫描光盘,并返回三个对象; 4. 使用 open()打开 mycd.cdc 文件对象,并声明成追加模式,逐行记录以上三个对象。 不过,执行没有报错,而且文件也生成了,但是为什么打不开?……,呵呵,那是另一个 问题了。 小结 通过指点,以及在文档中狂乱的搜寻,小白今天顺利地将光盘信息全部扫描出来了,并 存储成了文件! 不过仅仅 4 行代码,真正运行可用的也就两行代码,居然已经可以达到想要的软件功能 的 50%……Python 是不是很神奇? 今天小白其实已经接触到了一大批概念: 1. 模块 —— import os; 2. 内置函式 —— open(); 3. 循环 —— for ... in ...; 4. 块界定符; 5. 注释符; 6. 对象; 7. 文件对象; 8. 对象转换; 9. 格式化声明 —— %s; 10. 数据类型。 14 | 实例故事 不过它们都包含在了 4 行代码中。我们的原则是:先用后学,快速获得体验,然后寻求 理论支持,所以,先不求甚解,达到目的,然后就自在了。 练习 1. os 模块中还有哪些功能可以使用?提示:使用 dir()和 help()。 2. open() 还有哪些模式可以使用? 3. 尝试 for .. in ..循环可以对哪些数据类型进行操作? 4. 格式化声明,还有哪些格式可以进行约定? 5. 下面的写入文件模式好吗? 有改进的余地吗? 下面是 CDay4-5.py ,它好在哪里? 1 # -*- coding: utf-8 -*- 2 import os 3 export = "" 4 for root, dirs, files in os.walk('/media/cdrom0'): 5 export+="\n %s;%s;%s" % (root,dirs,files) 6 open('mycd2.cdc', 'w').write(export) 以下的 CDay4-6.py 又更加好在哪里? 1 # -*- coding: utf-8 -*- 2 import os 3 export = [] 4 for root, dirs, files in os.walk('/media/cdrom0'): 5 export.append("\n %s;%s;%s" % (root,dirs,files)) 6 open('mycd2.cdc', 'w').write(''.join(export)) 6. 读取文件 cdays4-test.txt 内容,去除空行和注释行后,以行为单位进行排序,并将 结果输出为 cdays4-result.txt。 #some words Sometimes in life, You find a special friend; Someone who changes your life just by being part of it. Someone who makes you laugh until you can't stop; Someone who makes you believe that there really is good in the world. Someone who convinces you that there really is an unlocked door just waiting for you to open it. This is Forever Friendship. 涉及知识点的进一步信息请 查阅对应的作弊条: PCS100“import”说明引入 模块的技巧 PCS205“内建函式”介绍一 些最常用的内建函式 PCS102“For 循环”介绍最 常用的循环体 PCS103“缩进”阐述了 Python 最大的特点:使用 缩进来区分语法单位 PCS104“注释”介绍了 Python 式的注释方式 PCS105“对象”介绍了 Python 中的一等公民 PCS106“文件对象”介绍了 最常用的对外交互渠道:文 件,及其处置对象 PCS107“字串格式化”介绍 了 Python 内置的字符模板 支持特性 PCS101“内建数据类型”介 绍了动态语言的最大便利: 自由类型转换的体验 P C S panzhizhou 高亮 列表和元组都行 CDays“光盘故事” | 15 when you're down, and the world seems dark and empty, Your forever friend lifts you up in spirits and makes that dark and empty world suddenly seem bright and full. Your forever friend gets you through the hard times,the sad times,and the confused times. If you turn and walk away, Your forever friend follows, If you lose you way, Your forever friend guides you and cheers you on. Your forever friend holds your hand and tells you that everything is going to be okay. 16 | 实例故事 CDay3 通过函式进行功能化 不断否定自己,但要坚持最初的意愿——不论战术上如何变化,千万不要忘记战略目标。 如果小白真正理解和可以自如应用前一日所讲的 4 行代码中包含的各种知识,那么,离 完成软件之日就已经不远了。 需求 首先小白根据已有的体验,对 PyCDC 的软件需求进行了进一步完善。 1. 将光盘内容索引存储为硬盘上的文本文件。 1)存储成*.cdc 的文本文件; 2)可以快速指定文件名。 2. 根据储存到硬盘上的光盘信息进行搜索。 1)可以搜索指定目录中所有*.cdc文件。 这样一来,可以看出 PyCDC 的使用其实分为两部分。 1. 刻录光盘时,将光盘信息通过 PyCDC 存储为对应光盘标号的*.cdc文件。 2. 使用光盘时,在 PyCDC 中搜索,确认.cdc文件名,即光盘标号,从而针对性地读 取确切的光盘,不用遍寻所有光盘了! CDays“光盘故事” | 17 功能化 简单地讲就是将以往验证想法的代码,变成可以方便使用的功能,让它可以重复在不同 应用环境中使用。小白想象着自个儿的 PyCDC 可以像普通的命令行工具一样来使用: python pycdc.py -e mycd1-1.cdc #将光盘内容记录为 mycd1-1.cdc python pycdc.py -e cdc/mycd1-1.cdc #将光盘内容记录到 cdc 目录中的 mycd1-1.cdc python pycdc.py -d cdc -k 中国火 #搜索 cdc 目录中的光盘信息,寻找有“中国火”字样的文件或是目录,在那张光盘中 可能还有其他的功能,但是最核心的功能应该就是这 3 样。 要想达到这种效果,最直接的的方法就是函式化! 函式化 声明函式名,定义参数,然后使用缩进,将前一日摸索出来的代码包装一下,使用参数 代替原先指定的目录和文件名,请看 CDay3-1.py。 1 # -*- coding: utf-8 -*- 2 import os 3 def cdWalker(cdrom,cdcfile): 4 export = "" 5 for root, dirs, files in os.walk(cdrom): 6 export+="\n %s;%s;%s" % (root,dirs,files) 7 open(cdcfile, 'w').write(export) 8 cdWalker('/media/cdrom0','cd1.cdc') 9 cdWalker('/media/cdrom0','cd2.cdc') 小白获得了第一个 Python 函式,并成功运行了两次,即将同张光盘的内容记录到不同的 文件中!非常 easy。 交互参数 但是如何从命令行获取输入的参数呢? 搜索或是询问后,从行者那儿又获得一个提示:print sys.argv。 那么,无畏的小白立即创建了一个将真正使用的功能脚本 pycdc-v0.1.py,并尝试加入了 最新的提示代码: PCS108“函式”进一步说明 了什么是函式,什么时候应 该将代码集成为函式等知识。 在 Python 中对象是一等公 民,函式则是实际可用脚本 中最基础的人民了。 精巧地址: http://bit.ly/vrqUk P C S 1 0 8 18 | 实例故事 1 # -*- coding: utf-8 -*- 2 import os 3 print sys.argv 4 def cdWalker(cdrom,cdcfile): 5 export = "" 6 for root, dirs, files in os.walk(cdrom): 7 export+="\n %s;%s;%s" % (root,dirs,files) 8 open(cdcfile, 'w').write(export) 9 #cdWalker('/media/cdrom0','cd1.cdc') 运行结果如图 CDay3-1 所示: 图 CDay3-1 pycdc-v0.1.py运行结果 OK,出错了,但是有了 os模块的经验,瞧着 sys.argv 这么眼熟,小白猜这是个模块, 需要引入,所以微小地改动了一下代码: 1 # -*- coding: utf-8 -*- 2 import os,sys 3 print sys.argv 4 def cdWalker(cdrom,cdcfile): 5 export = "" 6 for root, dirs, files in os.walk(cdrom): 7 export+="\n %s;%s;%s" % (root,dirs,files) 8 open(cdcfile, 'w').write(export) 9 #cdWalker('/media/cdrom0','cd1.cdc') 运行结果如图 CDay3-2 所求: 图 CDay3-2 修改 pycdc-v0.1.py后的运行结果 Great! 一切如愿,然后就是简单的识别参数问题了。 逻辑判断 好了,小白有了自个儿的体验:当面对不熟悉的工具时,会对应该输入什么参数一头雾 水,此时,若软件能友好智能地进行提示,就太好了…… PCS113 “交互参数”进一 步分享了有关交互参数的使 用方法,读者可以深入了解 sys 及其使用方法。 P C S 1 1 3 CDays“光盘故事” | 19 要做到这一点,得对未知用户的行为进行判定,对非期待的输入进行提示,而不是由 Python 自个儿出错中断。与其他语言类似,Python 中也有 if、else 等类似逻辑判别语句, 不妨找到相关内容,照猫画虎: 1 # -*- coding: utf-8 -*- 2 import os,sys 3 CDROM = '/media/cdrom0' 4 def cdWalker(cdrom,cdcfile): 5 export = "" 6 for root, dirs, files in os.walk(cdrom): 7 export+="\n %s;%s;%s" % (root,dirs,files) 8 open(cdcfile, 'w').write(export) 9 #cdWalker('/media/cdrom0','cd1.cdc') 10 if "-e"==sys.argv[1]: 11 cdWalker(CDROM,sys.argv[2]) 12 print "记录光盘信息到 %s" % sys.argv[2] 13 else: 14 print '''PyCDC 使用方式: 15 python pycdc.py -e mycd1-1.cdc 16 #将光盘内容记录为 mycd1-1.cdc 17 ''' 代码注解: 1. 使用全局参数 CDROM 指定当前的光盘访问路径,总是/media/cdrom0; 2. 通过 if "-e"==sys.argv[1] 判定第二个参数是-e 时,使用第三个参数作输出文件 名记录光盘信息,并输出提示; 3. 通过 else 捕获所有意外情况,输出错误提示,结束脚本。 OK,看起来应该已经完成了一两项功能,但是实际运行时,结果如图 CDay3-3 所示: 图 CDay3-3 pycdc-v0.1.py运行 IO错误 尝试带目录的输出时: IOError: [Errno 2] No such file or directory: 'cdc/mycd-1.cdc' I/O——输入/出问题,当然啦,cdc 目录并不存在。 手工建立 cdc 目录后,再运行就 OK 了,所以功能设计细化为: PCS109 “系统参数”进一 步分享了有关函式参数的使 用技巧,对于 cdWalker(CDROM, sys.argv[2]) ,读者可以深入 了解其使用方法。 P C S 1 0 9 PCS110 “逻辑分支”进一 步详细说明了进行条件判别 时 Python 支持的方式。 P C S 1 1 0 20 | 实例故事 ~$python pycdc.py -e mycd1-1.cdc ##第 2个参数是"-e";使用 cdWalker()将光盘内容记录为 mycd1-1.cdc ~$python pycdc.py -e cdc/mycd1-1.cdc ##第 2个参数是"-e";而且第 3个参数中含有目录指定; ##就将光盘内容记录到 cdc 目录中的 mycd1-1.cdc;如果 cdc 目录不存在,可以自动创建。 ~$python pycdc.py -d cdc -k 中国火 ##第 2个参数是"-d";而且第 4个参数是"-k"; ##就搜索 cdc 目录中的光盘信息,输出含有关键字“中国火”的文件或是目录,指出它在哪张光 盘中。 完成以上所有功能和判定部分的伪代码: if "-e"==sys.argv[1]: #判别 sys.argv[2]中是否有目录,以便进行自动创建 cdWalker(CDROM,sys.argv[2]) print "记录光盘信息到 %s" % sys.argv[2] elif "-d"==sys.argv[1]: if "-k"==sys.argv[3]: #进行文件搜索 else: print '''PyCDC 使用方式: python pycdc.py -d cdc -k 中国火 #搜索 cdc 目录中的光盘信息,寻找有“中国火”字样的文件或是目录在哪张光盘中 ''' else: print '''PyCDC 使用方式: python pycdc.py -d cdc -k 中国火 #搜索 cdc 目录中的光盘信息,寻找有“中国火”字样的文件或是目录在哪张光盘中 ''' 到这一步,小白已经开始头大了,如果功能继续追加,软件进一步友好地自动识别各种 意外情况,这棵逻辑树将会可怕地增长下去…… 小白没有耐心和信心面对如此永无止境的意外情况的判别,于是开始寻找其他解决方 案…… 小结 为了快速将已知技巧转化为可用脚本,小白接触到了以下知识: 1. sys 模块的接收交互参数; 2. 函式概念; panzhizhou 高亮 CDays“光盘故事” | 21 3. 逻辑判定语句; 4. 伪代码技术,进行开发复杂度的估算。 练习 1. 根据 DiPy 10.6. 处理命令行参数(http://www.woodpecker.org.cn/diveintopython/ scripts_and_streams/command_line_arguments.html,精巧地址:http://bit.ly/1x5gMw), 使用 getopt.getopt()优化当前功能函式。 2. 读取某一简单索引文件 cdays3-test.txt,其每行格式为:文档序号关键词,现须根据 这些信息将它转化为倒排索引,即统计关键词在哪些文档中,格式如下:包含该关 键词的文档数 关键词 => 文档序号。其中,原索引文件作为命令行参数传入主程序, 并设计一个 collect 函式统计“关键字序号”结果对,最后在主程序中输出结果至 屏幕。 cdays3-test.txt 内容: 1 key1 2 key2 3 key1 7 key3 8 key2 10 key1 14 key2 19 key4 20 key1 30 key3 3. 在一个 88 国际象棋盘上,有 8 个皇后,每个皇后占一格;要求皇后间不会出现相 互“攻击”的现象,即不能有两个皇后处在同一行、同一列或同一对角线上,问共 有多少种不同的方法。 PCS200 “os(.stat;.path)” 详细说明了 os 及其包含模 块的常用函式;分享了 os 在 常见场景中的使用技巧。 P C S 2 0 0 panzhizhou 高亮 22 | 实例故事 CDay2 完成核心功能 利用文本文件完成核心功能 没有完美的软件,够用并且容易使用的软件已经算是完美的了。 回顾需求 已经获得命令行工具样的程序的小白几乎可以脱离小白的称号了,他可以独立根据已往 经验,不断尝试出成果来,就该是大白了。 现在可以将最初的需求细化成这样: 1. 将光盘内容索引存储为硬盘上的文本文件 1) 存储成 *.cdc 的文本文件 2) 可以快速指定文件名 z 通过命令行调用 python pycdc.py -e mycd1-1.cdc 2. 根据储存到硬盘上的光盘信息进行搜索 1) 可以搜索指定目录中所有*.cdc 文件 z 通过命令行调用 python pycdc.py -d cdc -k 中国火 但是,要完成一个个看似简单,实际有 N多情况的逻辑判定,实在是件令人沮丧的事儿, 小白吼了声:“俺就是想做个简单的命令行工具,咋就这么难呢?” 热心的行者,又出声了:“使用 cmd吧!” CDays“光盘故事” | 23 cmd模块 cmd : Support for line-oriented command interpreters 咦?它是专门支持命令行界面的模块?!但是几乎没有可以照抄的代码呀! 照猫画虎的重要资源 不搜不知道,一搜吓一跳!原来英文技术书已在出版社网站上公开了书中的代码样例, 比如:《Learning Python》(见图 CDay2-1)、《Learning Python,Second Edition》。 按照大学里论文的制造模式进行相关尝试(即从已被证实正确的基础上加以改造),成功 的机会比较大! 图 CDay2-1 Learning Python 那么,我们可以参考第一版《Leaning Python》第 9 章的例程 rolo.py。 重构当前代码 重构(refactoring), 听上去好像是很高级的编程技术,其实说穿了就是自个儿看不过去 自个儿,于是不断地将代码修改得更加合理,使之运行起来更加高效。小白的目标是快 速实现心中的功能,但是现在面对的又一个全新的模块,他想使用干净的脚本进行尝试, 所以考虑重构,于是将原先的代码整理到 cdctools.py,创建新脚本 pycdc-v0.4.py: 1 # -*- coding: utf-8 -*- 2 import sys, cmd “资源索引”章节中有完整 的在线中文文档的资源介 绍,有意的读者可以在网络 中针对性的对有兴趣的 Python 内容进一步学习。 精巧地址: http://bit.ly/vrqUk 24 | 实例故事 3 class PyCDC(cmd.Cmd): 4 def __init__(self): 5 cmd.Cmd.__init__(self) # initialize the base class 6 def help_EOF(self): 7 print "退出程序 Quits the program" 8 def do_EOF(self, line): 9 sys.exit() 10 11 def help_walk(self): 12 print "扫描光盘内容 walk cd and export into *.cdc" 13 def do_walk(self, filename): 14 if filename == "":filename = raw_input("输入 cdc文件名:: ") 15 print "扫描光盘内容保存到:'%s'" % filename 16 17 def help_dir(self): 18 print "指定保存/搜索目录" 19 def do_dir(self, pathname): 20 if pathname == "": pathname = raw_input("输入指定保存/搜索目录: ") 21 22 def help_find(self): 23 print "搜索关键词" 24 def do_find(self, keyword): 25 if keyword == "": keyword = raw_input("输入搜索关键字: ") 26 print

编辑推荐

  • 名称/格式
  • 评分
  • 下载次数
  • 资料大小
  • 上传时间

用户评论

0/200
    暂无评论
上传我的资料

相关资料

资料评价:

/ 420
所需积分:1 立即下载
返回
顶部
举报
资料
关闭

温馨提示

感谢您对爱问共享资料的支持,精彩活动将尽快为您呈现,敬请期待!