.. _tut-brieftour:
**********************************
Python 标准库概览
**********************************
.. _tut-os-interface:
操作系统接口
==========================
`os`_ 模块提供了很多与操作系统交互的函数::
>>> import os
>>> os.getcwd() # Return the current working directory
'C:\\Python35'
>>> os.chdir('/server/accesslogs') # Change current working directory
>>> os.system('mkdir today') # Run the command mkdir in the system shell
0
应该用 ``import os`` 风格而非 ``from os import *``。这样可以保证随操作系统不同而有所变化的 `os.open()`_ 不会覆盖内置函数 `open()`_。
.. index:: builtin: help
在使用一些像 `os`_ 这样的大型模块时内置的 `dir()`_ 和 `help()`_ 函数非常有用::
>>> import os
>>> dir(os)
Nov. 25, 09:43:32 PM EST
>>> import smtplib
>>> server = smtplib.SMTP('localhost')
>>> server.sendmail('soothsayer@example.org', 'jcaesar@example.org',
... """To: jcaesar@example.org
... From: soothsayer@example.org
...
... Beware the Ides of March.
... """)
>>> server.quit()
(注意第二个例子需要在 localhost 运行一个邮件服务器。)
.. _tut-dates-and-times:
日期和时间
===============
`datetime`_ 模块为日期和时间处理同时提供了简单和复杂的方法。支持日期和时间算法的同时,实现的重点放在更有效的处理和格式化输出。该模块还支持时区处理。 ::
>>> # dates are easily constructed and formatted
>>> from datetime import date
>>> now = date.today()
>>> now
datetime.date(2003, 12, 2)
>>> now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
'12-02-03. 02 Dec 2003 is a Tuesday on the 02 day of December.'
>>> # dates support calendar arithmetic
>>> birthday = date(1964, 7, 31)
>>> age = now - birthday
>>> age.days
14368
.. _tut-data-compression:
数据压缩
================
以下模块直接支持通用的数据打包和压缩格式:`zlib`_, `gzip`_, `bz2`_, `lzma`_, `zipfile`_ 以及
`tarfile`_。 ::
>>> import zlib
>>> s = b'witch which has which witches wrist watch'
>>> len(s)
41
>>> t = zlib.compress(s)
>>> len(t)
37
>>> zlib.decompress(t)
b'witch which has which witches wrist watch'
>>> zlib.crc32(s)
226805979
.. _tut-performance-measurement:
性能度量
=======================
有些用户对了解解决同一问题的不同方法之间的性能差异很感兴趣。Python 提供了一个度量工具,为这些问题提供了直接答案。
例如,使用元组封装和拆封来交换元素看起来要比使用传统的方法要诱人的多。`timeit`_ 证明了后者更快一些::
>>> from timeit import Timer
>>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
0.57535828626024577
>>> Timer('a,b = b,a', 'a=1; b=2').timeit()
0.54962537085770791
相对于 `timeit`_ 的细粒度,`profile`_ 和 `pstats`_ 模块提供了针对更大代码块的时间度量工具。
.. _tut-quality-control:
质量控制
===============
开发高质量软件的方法之一是为每一个函数开发测试代码,并且在开发过程中经常进行测试。
`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
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
.. _tut-batteries-included:
“瑞士军刀”
==================
Python 展现了“瑞士军刀”的哲学。这可以通过它更大的包的高级和健壮的功能来得到最好的展现。列如:
* `xmlrpc.client`_ 和 `xmlrpc.server`_ 模块让远程过程调用变得轻而易举。尽管模块有这样的名字,用户无需拥有 XML 的知识或处理 XML。
* `email`_ 包是一个管理邮件信息的库,包括MIME和其它基于 RFC2822 的信息文档。
不同于实际发送和接收信息的 `smtplib`_ 和 `poplib`_ 模块,email 包包含一个构造或解析复杂消息结构(包括附件)及实现互联网编码和头协议的完整工具集。
* `xml.dom`_ 和 `xml.sax`_ 包为流行的信息交换格式提供了强大的支持。同样, `csv`_ 模块支持在通用数据库格式中直接读写。
综合起来,这些模块和包大大简化了 Python 应用程序和其它工具之间的数据交换。
* 国际化由 `gettext`_, `locale`_ 和 `codecs`_ 包支持。
.. _os: https://docs.python.org/3/library/os.html#module-os
.. _os.open(): https://docs.python.org/3/library/os.html#os.open
.. _open(): https://docs.python.org/3/library/functions.html#open
.. _dir(): https://docs.python.org/3/library/functions.html#dir
.. _help(): https://docs.python.org/3/library/functions.html#help
.. _shutil: https://docs.python.org/3/library/shutil.html#module-shutil
.. _glob: https://docs.python.org/3/library/glob.html#module-glob
.. _sys: https://docs.python.org/3/library/sys.html#module-sys
.. _getopt: https://docs.python.org/3/library/getopt.html#module-getopt
.. _getopt(): https://docs.python.org/3/library/getopt.html#module-getopt
.. _argparse: https://docs.python.org/3/library/argparse.html#module-argparse
.. _re: https://docs.python.org/3/library/re.html#module-re
.. _math: https://docs.python.org/3/library/math.html#module-math
.. _random: https://docs.python.org/3/library/random.html#module-random
.. _urllib.request: https://docs.python.org/3/library/urllib.request.html#module-urllib.request
.. _smtplib: https://docs.python.org/3/library/smtplib.html#module-smtplib
.. _datetime: https://docs.python.org/3/library/datetime.html#module-datetime
.. _zlib: https://docs.python.org/3/library/zlib.html#module-zlib
.. _gzip: https://docs.python.org/3/library/gzip.html#module-gzip
.. _bz2: https://docs.python.org/3/library/bz2.html#module-bz2
.. _lzma: https://docs.python.org/3/library/lzma.html#module-lzma
.. _zipfile: https://docs.python.org/3/library/zipfile.html#module-zipfile
.. _tarfile: https://docs.python.org/3/library/tarfile.html#module-tarfile
.. _timeit: https://docs.python.org/3/library/timeit.html#module-timeit
.. _profile: https://docs.python.org/3/library/profile.html#module-profile
.. _pstats: https://docs.python.org/3/library/profile.html#module-pstats
.. _doctest: https://docs.python.org/3/library/doctest.html#module-doctest
.. _unittest: https://docs.python.org/3/library/unittest.html#module-unittest
.. _xmlrpc.client: https://docs.python.org/3/library/xmlrpc.client.html#module-xmlrpc.client
.. _xmlrpc.server: https://docs.python.org/3/library/xmlrpc.server.html#module-xmlrpc.server
.. _email: https://docs.python.org/3/library/email.html#module-email
.. _poplib: https://docs.python.org/3/library/poplib.html#module-poplib
.. _xml.dom: https://docs.python.org/3/library/xml.dom.html#module-xml.dom
.. _xml.sax: https://docs.python.org/3/library/xml.sax.html#module-xml.sax
.. _csv: https://docs.python.org/3/library/csv.html#module-csv
.. _gettext: https://docs.python.org/3/library/gettext.html#module-gettext
.. _locale: https://docs.python.org/3/library/locale.html#module-locale
.. _codecs: https://docs.python.org/3/library/codecs.html#module-codecs