文章目录
一、模块基础
1.1 模块包含什么
假设你听说有一个名为copy的标准模块
>>> import copy
- 使用dir
要查明模块包含哪些东西,可使用
函数dir
,它列出对象的所有属性(对于模块,它列出所有的函数、类、变量等)
在这些名称中,有几个以下划线打头。根据约定,这意味着它们并非供外部使用。
>>> [n for n in dir(copy) if not n.startswith('_')]
['Error', 'PyStringMap', 'copy', 'deepcopy', 'dispatch_table', 'error', 'name', 't', 'weakref']
# 结果包含dir(copy)返回的不以下划线打头的名称,这比完整清单要好懂些。
- 变量__all__
这个变量包含一个列表,它与前面使用列表推导创建的列表类似,但是在模块内部设置的
>>> copy.__all__
['Error', 'copy', 'deepcopy']
- 这个__all__列表是怎么来的呢?
- 它是在模块copy中像下面这样设置的(这些代码是直接从copy.py复制而来的):
__all__ = ["Error", "copy", "deepcopy"]
- 为何要提供它呢?
- 旨在定义模块的公有接口。具体地说,它告诉解释器从这个模块导入所有的名称意味着什么:
from copy import *
: 将只能得到变量__all__中列出的4个函数
要导入PyStringMap,必须显式地:导入copy并使用copy.PyStringMap;或者使用from copy import PyStringMap。
- 总结
编写模块时,像这样设置__all__也很有用。因为模块可能包含大量其他程序不需要的变量、函数和类,比较周全的做法是将它们过滤掉。如果不设置__all__,则会在以import *方式导入时,导入所有不以下划线打头的全局名称。
1.2 使用help 获取帮助
>>> help(copy.copy)
Help on function copy in module copy:
copy(x)
Shallow copy operation on arbitrary Python objects.
See the module's __doc__ string for more info.
'''
上述帮助信息指出,函数copy只接受一个参数x,且执行的是浅复制
文档字符串就是在函数开头编写的字符串,用于对函数进行说明,而函数的属性__doc__可能包
含这个字符串
'''
1.3 文档和源代码
文档是有关模块信息的自然来源。例如,你可能想知道range的参数是什么?在这种情况下,与其在Python图书或标准Python文档中查找对range的描述,不如直接检查这个函数。
>>> print(range.__doc__)
range(stop) -> range object
range(start, stop[, step]) -> range object
Return an object that produces a sequence of integers from start (inclusive)
to stop (exclusive) by step. range(i, j) produces i, i+1, i+2, ..., j-1.
start defaults to 0, and stop is omitted! range(4) produces 0, 1, 2, 3.
These are exactly the valid indices for a list of 4 elements.
When step is given, it specifies the increment (or decrement).
假设你要阅读标准模块copy的代码,可以在什么地方找到呢?一种办法是像解释器那样通sys.path来查找,但更快捷的方式是查看模块的特性
__file__
>>> print(copy.__file__)
C:\Python35\lib\copy.py
二、常见模块
2.1 sys使用
模块sys让你能够访问与Python解释器紧密相关的变量和函数
- 代码示例
# 反转并打印命令行参数
# reverseargs.py
import sys
args = sys.argv[1:]
args.reverse()
print(' '.join(args))
# 运行:
$ python reverseargs.py this is a test
test a is this
2.2 os
模块os让你能够访问多个操作系统服务。
os及其子模块os.path还包含多个查看、创建和删除目录及文件的函数,以及一些操作路径的函数(例如,os.path.split和os.path.join让你在大多数情况下都可忽略os.pathsep)。
例如,要访问环境变量PYTHONPATH,可使用表达式
os.environ['PYTHONPATH']
。这个映射也可用于修改环境变量,但并非所有的平台都支持这样做。
函数os.system用于运行外部程序。还有其他用于执行外部程序的函数,如execv和popen。前者退出Python解释器,并将控制权交给被执行的程序,而后者创建一个到程序的连接(这个连接类似于文件)。
看看启动Web浏览器的问题。命令system可用于执行任何外部程序,这在UNIX等环境中很有用,因为你可从命令行执行程序(或命令)来列出目录的内容、发送电子邮件等。它还可用于启动图形用户界面程序,如Web浏览器。
# UNIX中,可像下面这样做(这里定/usr/bin/firefox处有浏览器):
os.system('/usr/bin/firefox')
# 在Windows中,可以这样做(同样,这里指定的是你安装浏览器的路径):
os.system(r'C:\"Program Files (x86)"\"Mozilla Firefox"\firefox.exe')
'''
请注意,这里用引号将Program Files和Mozilla Firefox括起来了
另一个函数更适合用于完成这项任务,它就是Windows特有的函数os.startfile。
os.startfile(r'C:\Program Files (x86)\Mozilla Firefox\firefox.exe')
请注意,在Windows中,使用os.system或os.startfile启动外部程序后,当前Python程序将继续运行;
而在UNIX中,当前Python程序将等待命令os.system结束。
'''
2.3 fileinput
模块fileinput让你能够轻松地迭代一系列文本文件中的所有行。
2.4 集合、堆和双端队列⭐⭐
- 集合
以前,集合是由模块sets中的Set类实现的;新的版本中,集合是由内置类set实现的,意味着你可直接创建集合,而无需导入模块sets。
>>> set(range(10))
{
0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
可使用序列(或其他可迭代对象)来创建集合,也可使用花括号显式地指定。请注意,不能仅使用花括号来创建空集合,因为这将创建一个空字典。
>>> type({
})
<class 'dict'>
必须在不提供任何参数的情况下调用set。集合主要用于成员资格检查,因此将忽略重复的元素:
>>> {
0, 1, 2, 3, 0, 1, 2, 3, 4, 5}
{
0, 1, 2, 3, 4, 5}
集合中元素的排列顺序是不确定的: