学习Python Doc第九天: 标准库巡礼(一)

目录

Python 提供了丰富的标准库。本文快速浏览这些标准库的一部分。

1 操作系统接口

为方便和操作系统交互,=OS= 模块提供多个函数接口。看代码:

import os # import the function provided by os module
os.getcwd() # get the current working directory
os.chdir('/usr/local/python') #change the current working directory
os.system('mkdir newDir') #run the command mkdir in the system shell

需要说明的是:必须使用 import os 来导入模块而不是 from os import * 。后者会导致 Python 内置的 open() 覆盖 os.open() .

在使用像 os 这样比较大的模块时, Python 内置的 dir()help() 可以方便的提供交互式帮助。

import os
dir(os) # list all module functions
help(os) # return manual page

对于日常的文件和文件夹操作, shutil 模块提供了一些简单易用的接口。

import shutil
shutil.copyfile('data.db','archive.db')
shutil.move('/usr/local/source.txt','destination.txt')

2 文件统配符

glob 模块提供了使用通配符在当前目录中搜寻文件的功能。

import glob
glob.glob('*.py') #find all .py files

通配符叫做 wildcards ,中文叫外卡。记得有次林丹通过外卡进入了一个顶级的羽毛球比赛。

3 命令行参数

通常,在脚本文件中经常要用到命令行参数。这些参数保存在 sys 模块中。比如下面的命令输出调用 python demo.py one two three 后的系统参数。

import sys
print(sys.argv)

>>> ['demo.py', 'one', 'two','three']

在处理 sys.argv 的过程中, getopt 模块采用和Unix函数 getopt() 一样的规则。 argparse 模块提供了更强大的命令行处理函数。

4 错误重定向

sys 模块有属性 stdin,stdout,stderrstderr 在生成警告和错误信息的过程中经常用到。

sys.stderr.write('warning, log file not found ')

终止一个脚本最直接的办法是 sys.exit()

5 字符串匹配

re 模块提供了正则表达式工具。使用这些工具可以完成许多高级的的字符串处理工作。对于复杂的匹配和操作,正则表达式提供了清晰且优质的解决方案。

import re
re.findall(r'\bf[a-z]*','which foot or hand fell fastest')
>>> ['foot','fell','fastest']
re.sub(r'(\b[a-z]+) \l', r'\l', 'cat in the hat')
'cat in the hat'

简单的字符处理任务通过系统自带的方法就可以完成。

'tee for too'.replace('too','two')
>>> 'tea for two'

6 数学

看到 mathematics 的时候,我总有一种莫名的好感,来看看 python 提供了什么样的数学模块吧。

Python 使用 math 模块来提供数学函数。这些函数是用 C 来完成的。

import math
math.cos(math.pi / 4)
>>> 0.70710678118654757
math.log(1024,2)
>>>10.0

math 的输出结果是浮点的。

random 模块提供了生成随机数的函数。

import random
random.choice(['apple', 'pear','banana'])
>>> 'pear'
random.sample(range(100),10) # sampling without replacement
>>>[0, 35, 54, 53, 36, 95, 11, 48, 23, 97]
random.random() #random float
>>>0.07476343923517015
random.randrange(60) #random integer chose from range(6)
>>> 13

statistics 模块提供了基本的统计函数,包括均值 mean ,中位数 meadian , 方差 variance .

In [118]: import statistics

In [127]: data = [2.75,1.75,1.26,0.25,0.5,1.25,3.5]

In [128]: statistics.mean(data)
Out[138]:
1.6085714285714285

In [139]: statistics.mean(data)
Out[145]:
1.6085714285714285

In [146]: statistics.median(data)
Out[146]:
1.26

In [147]: statistics.variance(data)
Out[153]:
1.370847619047619

值得注意的是 Python 提供的这些数学函数在 scipy 这个第三方库面前就是个小儿科。所以投入更多的时间去学习 scipy 收获更多。

7 Internet 接入

python 提供了很多与 internet有关的模块。两个最简单的是 urllib.requestsmtplib 。前者从 URL 获取数据,后者用于发送邮件。

我对这些包不感兴趣,通信工程师对 scipy 更感兴趣。不过有个大概印象总是好的,万一那一天去了互联网公司。。。。

8 日期和时间

datetime 包提供了很多类用于操作日期和时间。使用这些类操作日期和时间,可简单可复杂,丰俭由人。这些类提供了漂亮的时间显示格式和时区计算。

In [179]: from datetime import date

In [198]: now = date.today()

In [217]: now
Out[217]:
datetime.date(2017, 4, 30)

In [218]: now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d of %B" )
Out[314]:
'04-30-17. 30 Apr 2017 is a Sunday on the 30 of April'

In [315]: birthday = date(1964,7,31)

In [338]: age = now -birthday

In [346]: age.days
Out[352]:
19266

9 数据压缩

Python 提供了 zlib,gzip,bz2,lzma,zipfile,tarfile 来支持数据压缩。

In [358]: import zlib

In [363]: s = b"I love mathematics and want to learn more"

In [413]: len(s)
Out[417]:
41

In [418]: t = zlib.compress(s)

In [426]: len(t)
Out[430]:
47

In [431]: zlib.decompress(t)
Out[435]:
b'I love mathematics and want to learn more'

In [436]: zlib.crc32(s)
Out[439]:
3762686923

压缩之后的长度还变长了,什么鬼?

In [440]: s = b'I love math and want learn more and more'

In [472]: s.len()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-475-cadf611cbf34> in <module>()
----> 1 s.len()

AttributeError: 'bytes' object has no attribute 'len'

In [476]: len(s)
Out[480]:
40

In [481]: t = zlib.compress(s)

In [486]: len(t)
Out[486]:
42

In [487]: s = b'witch which has which witches wrist watch'

In [526]: len(s)
Out[530]:
41

In [531]: t = zlib.compress(s)

In [536]: len(t)
Out[536]:
37

可见压缩后的长度跟数据本身有关,变长的原因是数据本身没有多少重复的,还引入了额外的 CRC 校验。

10 性能测试

不少发烧 Python 用户对于检测同一问题的不同实现之间的性能差异具有浓厚的兴趣。 Python 为此也提供了方便好用的工具。 timeit 就是一个这样的包。

11 质量控制

为每一个函数写测试脚本是完成高质量软件的有效方法。 doctest 包提供了一个工具,该工具可以扫描模块,并执行嵌套在注释中的测试脚本。

def average(values):
    """Computes the arithmetic mean of a list of numbers.

    >>> print(average([20, 30, 70]))
    40.0
    """
    return sum(values) / len(values)

import doctest
doctest.testmod()   # automatically validate the embedded tests

unittest 模块提供了比 doctest 更复杂更强大的功能。

import unittest

class TestStatisticalFunctions(unittest.TestCase):

    def test_average(self):
        self.assertEqual(average([20, 30, 70]), 40.0)
        self.assertEqual(round(average([1, 5, 7]), 1), 4.3)
        with self.assertRaises(ZeroDivisionError):
            average([])
        with self.assertRaises(TypeError):
            average(20, 30, 70)

unittest.main()  # Calling from the command line invokes all tests