操作系统接口

os模块提供了不少操作系统相关联的函数。

建议使用 import os 风格,而不是 from os import * 。这样可以保证随操作系统的不同而有变化的os.open() 不会覆盖内置函数 open()。

针对日常的文件和目录管理任务,shutil 模块提供了一个易于使用的高级接口:

import shutil

f = open('1.txt', 'w')
f.write('Hello')
f.close()

shutil.copyfile('1.txt', '2.txt')  # 复制文件到当前路径
shutil.move('1.txt', 'move/1.txt')  # 移动文件到当前路径下的move目录

文件通配符

glob 提供了一个函数检索当前目录所匹配的字符,并生成列表。

import glob

print(glob.glob('*.py'))
['main.py']

命令行参数

通过脚本工具经常调用命令行参数。这些命令行参数以链表形式储存在sys 模块的argv 变量里。

错误输出重定向和程序终止

sys 还有stin,stdout 和 stderr 属性,即使在stdout 被重定向时,后者也可以用于显示警告和错误。

大多数脚本的定向终止都使用sys.exit()。

字符串正则匹配

re 模块为高级字符串处理提供了正则表达式工具。对于复杂的匹配和处理,正则表达式提供了简洁、优化的解决方案。python高级会作讲解。

数学

math模块作为浮点运算提供了对底层C函数库的访问:

import math

print(math.log(1024, 2))
print(math.sqrt(4))
10.0
2.0

random提供了生成随机数的工具:

import random

print(random.choice(['apple', 'banana']))
print(random.sample(range(1, 101), 2))  # 从1-100随机选一个数
print(random.random())
print(random.randrange(11))  # 从0-10随机选一个数
banana
[27, 51]
0.14660367206614267
0

访问互联网

有几个模块用于访问互联网以及处理网络通信协议。其中最简单的两个是用于处理从 urls 接收的数据的 urllib.request 以及用于发送电子邮件的 smtplib。

日期与时间

datetime模块为日期和时间处理同时提供了简单和复杂的方法。

支持日期和时间算法的同时,实现的重点放在更有效的处理和格式化输出。

该模块还支持时区处理:

from datetime import date

now = date.today()
print(now)

print(now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B."))
2020-09-19
09-19-20. 19 Sep 2020 is a Saturday on the 19 day of September.

数据压缩

以下模块直接支持通用的数据打包和压缩格式:zlib,gzip,bz2,zipfile,以及 tarfile。

import zlib

s = b'Hello!World!Hello!World!Hello!World!'
print(len(s))

t = zlib.compress(s)
print(len(t))
print(zlib.decompress(t))
36
23
b'Hello!World!Hello!World!Hello!World!'

性能度量

有些用户对了解解决同一问题的不同方法之间的性能差异很感兴趣。Python 提供了一个度量工具,为这些问题提供了直接答案。

例如,使用元组封装和拆封来交换元素看起来要比使用传统的方法要诱人的多,timeit 证明了现代的方法更快一些。

from timeit import Timer

time1 = Timer('t=a;a=b;b=t', 'a=1;b=2').timeit()
time2 = Timer('a,b = b,a', 'a=1; b=2').timeit()
print(time1, time2)

测试模块

开发高质量软件的方法之一是为每一个函数开发测试代码,并且在开发过程中经常进行测试

doctest模块提供了一个工具,扫描模块并根据程序中内嵌的文档字符串执行测试。

测试构造如同简单的将它的输出结果剪切并粘贴到文档字符串中。

通过用户提供的例子,它强化了文档,允许 doctest 模块确认代码的结果是否与文档一致:

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


print(doctest.testmod())  # 自动验证嵌入测试
TestResults(failed=0, attempted=1)

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)
        self.assertRaises(ZeroDivisionError, average, [])
        self.assertRaises(TypeError, average, 20, 30, 70)

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