status

校对

ZoomQuiet

100%

校对

bfishadow; 1%

1. CDay -3 通过函式进行功能化

不断的否定自己,但是要坚持最初的愿意 --不论战术上如何变化,千万不要忘记战略目标

如果小白真正理解和可以自如应用前一日那四行代码中包含的各种知识,那么,离完成软件就已经不远了 ;-)

1.1. 需求

首先小白根据己有的体验,对PyCDC 的软件需求进行了进一步完善:

  1. 可以将光盘内容索引存储为硬盘上的文本文件
    • 存储成*.cdc 的文本文件

    • 可以快速指定文件名
  2. 可以根据储存到硬盘上的光盘信息进行搜索
    • 可以搜索指定目录中所有*.cdc文件

这样一来 PyCDC的使用,其实分两部分:

  1. 刻录光盘时,将光盘信息通过 PyCDC 存储为对应同光盘的标号的 *.cdc 文件

  2. 使用光盘时,在 PyCDC 中搜索,确认 .cdc文件名,即是光盘标号,从而针对性的读取光盘就好,不用遍寻所有光盘了!

1.2. 功能化?

简单的讲就是将以往验证想法的代码,变成可以方便使用的功能,可以重复在不同应用环境中使用, 小白想象自个儿的 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样

要想达到这种效果 直接的说,就是函式化!

1.2.1. 函式化?

声明函式名,定义参数,然后使用缩进,将前一日摸索出来的代码包装一下,使用参数代替原先指定的目录和文件名: CDay-3-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

详细:: 
PCS108 函式
进一步说明了什么是函式,什么时候应该将代码集成为函式等等知识;
在Python 中对象是一等公民,
函式则是实际可用脚本中最基础的人民了;

1.2.2. 系统参数

但是如何获得从命令行获取输入的参数呢?

搜索或是询问后,从行者那儿又获得一个提示: print sys.argv

那么无畏的小白立即创建一个将进行真正使用的功能脚本 pycdc-v0.1.py ,并尝试加入最新提示代码:

   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')

运行一下:

图 CDay-3-1

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')

运行一下:

图 CDay-3-2

Great! 一切如愿,然后就是简单的识别参数问题了:

1.2.3. 逻辑判断

好了,根据小白自个儿的体验:"在面对不熟悉的工具时,输入什么参数是一头雾水的,此时,若软件能友好智能的进行提示,就太好了..."

所以,得对未知用户的行为进行判定,对非期待的输入进行提示,而不是由Python 自个儿出错中断; 正如其它语言类似,什么if,else 等等逻辑判别,Python 同样的有,找到相关章节,照猫画虎:

   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 捕获所有意外情况,输出错误提示,结束脚本

详细:: 
PCS109 系统参数
进一步分享有关函式参数的使用技巧,
读者对于 cdWalker(CDROM,sys.argv[2]) 可以深入了解其使用方法;

PCS110 逻辑分支
进一步详细说明进行条件判别时Python 支持的方式

OK,看起来,应该已经完成了功能1~2,但是实际运行时:

图 CDay-3-3

... 尝试带目录的输出时:

IOError: [Errno 2] No such file or directory: 'cdc/mycd-1.cdc'

I/O -- 输入/出问题,嗯嗯嗯,当然了,cdc 目录不存在哪..

手工建立cdc目录后,再运行就OK了,所以功能设计细化为:

$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.3. 小结

为了快速将已知技巧转化为可用脚本,小白接触到了以下知识

  1. sys 模块的 接收系统参数
  2. 函式概念
  3. 逻辑判定语句
  4. 伪代码技术,进行开发复杂度的估算

详细:: 
PCS200 os
详细说明了 os 及其包含模块的常用函式;
分享了 os 常见使用场景中的技巧;

1.4. 练习

(1) 根据DiPy 10.6. 处理命令行参数(http://www.woodpecker.org.cn/diveintopython/scripts_and_streams/command_line_arguments.html )使用getopt.getopt()优化当前功能函式。

(2) 读取某一简单索引文件cdays-3-test.txt,其每行格式为文档序号 关键词,现需根据这些信息转化为倒排索引,即统计关键词在哪些文档中,格式如下:包含该关键词的文档数 关键词 => 文档序号。其中,原索引文件作为命令行参数传入主程序,并设计一个collect函式统计 "关键字<->序号" 结果对,最后在主程序中输出结果至屏幕。

cdays-3-test.txt 内容:

1 key1

2 key2

3 key1

7 key3

8 key2

10 key1

14 key2

19 key4

20 key1

30 key3

(3) 八皇后问题。在8*8的棋盘上,放置8个皇后,使得任两个皇后不在同行同列同正负对角线上。


::-- ZoomQuiet [2007-02-22 05:30:08]

Name Password4deL ;) :( X-( B-)
clpo yzkavgw   yzuils erawxl flxrvkoja wgyrqk afjpywdex tkjnhqylw wprufo
2008-05-07 14:11:36
ozeckvxr nwqplkyfz   cgfiqt vfhdsi rdoctxm zlimj vydsqwz ygteuowv evmikp http://www.hqicfgl.wiskdex.com
2008-05-07 14:13:12
xjeyibadc wnysu   nliqthof azyvqkgw iodzt njgcpi tmuo rsdq vktxdwpeu [URL]http://www.gmjbveqy.mazct.com[/URL] sgdkqxmv gutlknvf
2008-05-07 14:14:01