日期和时间
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."))
print(now.strftime('%Y{y}%m{m}%d{d}').format(y='年', m='月', d='日'))
# 支持日历计算
birthday = date(1964, 7, 31)
age = now - birthday
print(age.days)
复制
运行结果:
2022-01-01
01-01-22. 01 Jan 2022 is a Saturday on the 01 day of January.
2022年01月01日
20973
复制
数据压缩
zlib、gzip、bz2、lzma、zipfile 和 tarfile 模块直接支持常用的数据归档和压缩格式。
import zlib
s = b'witch which has which witches wrist watch'
print(len(s))
t = zlib.compress(s)
print(t)
print(len(t))
print(zlib.decompress(t))
print(zlib.crc32(s))
复制
运行结果:
41
b'x\x9c+\xcf,I\xceP(\xcf\xc8\x04\x92\x19\x89\xc5PV9H4\x15\xc8+\xca,.Q(O\x04\xf2\x00D?\x0f\x89'
37
b'witch which has which witches wrist watch'
226805979
复制
性能测量
一些 Python 用户对用不同方法处理同一问题的性能差异有浓厚的兴趣。Python 提供了一个测量工具,可以立即回答这些问题。
例如,可能会尝试使用元组打包和解包功能,而不是传统的参数交换方法。timeit 模块很快显示出适度的性能优势:
from timeit import Timer
print(Timer('t=a; a=b; b=t', 'a=1; b=2').timeit())
print(Timer('a,b = b,a', 'a=1; b=2').timeit())
复制
与 timeit 的细粒度级别相比,profile 和 pstats 模块提供了在更大的代码块中识别时间的工具。
质量控制
开发高质量软件的一种方法是在开发时为每个功能编写测试,并在开发过程中频繁地运行这些测试。
doctest 模块提供了一个工具,用于扫描模块和验证嵌入到程序文档字符串中的测试。测试构造非常简单,只需将一个典型调用及其结果剪切并粘贴到文档字符串中即可。这种方式通过向用户提供一个示例来改进文档,它允许 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
print(doctest.testmod()) # 自动验证嵌入的测试
复制
运行结果:
TestResults(failed=0, attempted=1)
复制
如果把40.0 改成其他数字,比如 30.0
运行结果:
Failed example:
print(average([20, 30, 70]))
Expected:
30.0
Got:
40.0
**********************************************************************
1 items had failures:
1 of 1 in __main__.average
***Test Failed*** 1 failures.
TestResults(failed=1, attempted=1)
复制
unittest 模块不像 doctest 模块那样简单,但它允许在一个单独的文件中维护一组更全面的测试:
import unittest
def average(values):
return sum(values) / len(values)
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()
复制
运行结果:
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
复制
自带工具(Batteries Included)
Python 有一个“自带工具”的哲学。这一点可以从它的大型包的复杂和健壮的功能中得到最好的体现。例如:
● xmlrpc.client 和 xmlrpc.server 模块使实现远程过程调用成为一项几乎微不足道的任务。尽管模块名称包含 xml,但不需要直接了解或处理 XML。
● email 包是一个用于管理电子邮件消息的库,包括 MIME 和其他基于 RFC 2822 的消息文档。与实际发送和接收消息的 smtplib 和 poplib 不同,email 包有一个完整的工具集,用于构建或解码复杂的消息结构(包括附件),以及实现互联网编码和报头协议。
● json 包为解析这种流行的数据交换格式提供了强大的支持。csv 模块支持以逗号分隔值格式直接读取和写入文件,数据库和电子表格通常支持这种格式。xml.etree.ElementTree、xml.dom 和 xml.sax 包支持 XML 处理。总之,这些模块和包大大简化了 Python 应用程序和其他工具之间的数据交换。
● sqlite3 模块是 SQLite 数据库库的包装器,提供了一个可以使用稍微不标准的 SQL 语法进行更新和访问的持久数据库。
● 国际化受到许多模块的支持,包括 gettext、locale 和 codecs 包。
官方文档:
https://docs.python.org/3.9/tutorial/stdlib.html