Tuesday, 30 September 2008

Python常用函数和库

介绍了Python的特性,该介绍一下我常用的Python的函数和库了~~ 1. Python内建函数和库 1.1 函数: map(func, list): 将某个函数func作用于list中的每个元素 1.2 库: re : 正则表达式库 正则表达式本身就非常的强大,尤其是Perl 5的正则表达式。Python中的正则表达式库当然也非常不错~~例如,我要找出某文本中所有带括号的字符串:
#!/usr/bin/env python

import re

regex = re.compile(r"\([^)]*\)")
s = "Python is (cool)! So is everthing that uses (Python)!"
matches = regex.findall(s)
for match in matches:
    print match
如此一来,我们就可以得到(cool)和(Python)这两个字符串了,关于正则表达式,网上有太多的文章可以参考了,而且书也一大堆,我就不介绍了~~ urllib: 网络库 这是Python中提供的一个最简单的网络访问库,但非常实用,而且也非常方便~~如果要获取某个网站中的内容(HTML),如下: f = urllib.urlopen("http://www.google.com") html = f.read() print html 以上是用GET方式获取内容,如果要用POST方式的话,可以如下: data = {"some_data" : "some_info"} f = urllib.urlopen("http://www.google.com", data) html = f.read() print html 该库中还有许多其他的网络相关实用函数哦~~ os, sys: 操作系统、文件、系统相关库 os库中包括许多操作系统相关函数,例如获取当前目录os.getcwd(),执行一个命令行os.popen等等。sys库中包含系统相关的函数和变量,例如最有用的莫过于sys.argv,这个可以得到命令行上的所有参数。比如我如果敲入:python todocmd.py add I have to do this,那么sys.argv就是一个数组:['python', 'todocmd.py', 'add', 'I', 'have', 'to', 'do']。 optparse: 命令行解析库 很多时候,我们需要写一个命令行的程序,而这个程序在命令行上又有许多的参数,例如我常用的pal日历程序: pal -r 4 可以告诉我我在4天内的所有事件~~当然,命令行参数远远不止这一个……那么,如果我要写这么一个程序,我就可以用到optparse这个库来解析这些命令行的参数。
#!/usr/bin/env python

from optparse import OptionParser

parser = OptionParser()
parser.add_option("-f", "--file", dest="filename",
help="write report to FILE", metavar="FILE")
parse.add_option("-q", "--quiet",
actoin="store_false", dest="verbose", default=True,
help="don't print status messages to stdout")

(options, args) = parser.parse_args()
以上就是一个简短的命令行解析程序块,当我在命令行上敲入:my_script -f outfile -q时,该程序块就会帮我读取到这些参数,并以数组的方式传给我~~另外,如果我敲入my_script -h,它还会自动输出参数帮助~~ 2. 外部库 2.1 cElementTree (去Google搜索ElementTree) XML在目前的应用非常广泛,而如果要操作XML的话,我们需要相应的解析器~~各种语言都提供了自己的解析器,Python也不例外。在Python中,我比较喜欢的XML解析器是cElementTree。它是ElementTree的C Python版本,所以拥有ElementTree的所有功能,但比ElementTree的性能更好~~以下是一个简短的解析程序:
#!/usr/bin/env python

import xml.etree.cElementTree as ct

f = open("example.xml")
tree = ct.parse(f)

nodes = tree.getiterator()
for node in nodes:
    for child in node:
        print child.attrib["name"]
2.2 yapgvb (http://yapgvb.sourceforge.net) 全称叫做:Yet another Python graphviz binding。知道Graphviz的人都知道其强大,它是用来生成有向和无向图的,对于我来说很有用,因为我可以用它来生成状态机、文字关系图、Ontology树等等。其最大的好处是能够自动排版,使得图中每个节点互不相碰~~用yapgvb的话,我可以非常方便的根据我的内容生成相应的图片。例如:
#!/usr/bin/env python

import yapgvb

nodes = ["jack", "shen", "eden", "xu"]
graph = yapgvb.Graph("Example Graph")
root = graph.add_node(label="Root")
for node in nodes:
   n = graph.add_node(label=node)
   edge = root >> n

graph.layout(yapgvb.engines.neato)
format = yapgvb.formats.png
graph.render("example.png")
可以生成以下图片: 2.3 docutils (http://docutils.sourceforge.net): 文档工具 这是我的最爱,除了Latex之外,一般的小型文档我就用它了~~Docutils自己定义了一种文档语言叫做RestructuredText,用它写成一个文档后,可以用Docutils生成HTML、Latex和S5。HTML和Latex就不介绍了,不过S5是我比较喜欢的东西,当时做幻灯片的时候就是用的RestructuredText生成的S5格式的幻灯片。S5其实是一种专门用来制作幻灯片的HTML格式,最终生成的幻灯片也非常漂亮,而且因为是HTML,所以可以直接用CSS和Javascript来调整版面、格式、颜色等等。 这个是我极力推荐的库,一定要看看~~ 恩,其实Python好的库还有许多,我这里就不一一介绍了。我准备在之后一个一个详细解说,例如:Django(快速原型Web框架), SQLObject(Object-Relational Mapping框架),Epydoc(Python API文档生成),Docutils(文档生成工具),Mako(模板语言工具)等等~~

1 comment:

darkfeather said...

同学,代码该缩进的要缩进啊,误导了小朋友怎么办