开箱即用
模块
模块就是程序
编写自己的模块
任何Python程序都可作为模块导入。
# 一个简单的模块
# hello.py
print("Hello, world!")
告诉解释器去哪里查找这个模块
# 当前会话有效
>>> import sys, pprint
>>> sys.path.append('C:\\Users\\15735\\desktop\\')
>>> pprint.pprint(sys.path)
['',
'D:\\Program Files\\Python\\Lib\\idlelib',
'D:\\Program Files\\Python\\python310.zip',
'D:\\Program Files\\Python\\DLLs',
'D:\\Program Files\\Python\\lib',
'D:\\Program Files\\Python',
'D:\\Program Files\\Python\\lib\\site-packages',
'C:\\Users\\15735\\desktop\\']
导入这个模块
>>> import hello
Hello, world!
PS:
当你导入模块时,可能发现其所在目录中除源代码文件外,还新建了一个名为__pycache__的子目录,这个目录包含处理后的文件,Python能够更高效地处理它们。
包
为组织模块,可将其编组为包(package)。包其实就是另一种模块,但有趣的是它们可包含其他模块。模块存储在扩展名为.py的文件中,而包则是一个目录。要被Python视为包,目录必须包含文件__init__.py。
一种简单的包布局
文件/目录 | 描述 |
---|---|
~/python/ | PYTHONPATH中的目录 |
~/python/drawing/ | 包目录(包drawing) |
~/python/drawing/__init__.py | 包代码(模块drawing) |
~/python/drawing/colors.py | 模块colors |
~/python/drawing/shapes.py | 模块shapes |
可以像下面这样使用:
import drawing # (1) 导入drawing包
import drawing.colors # (2) 导入drawing包中的模块colors
from drawing import shapes # (3) 导入模块shapes
- 执行第1条语句后,便可使用目录drawing中文件__init__.py的内容,但不能使用模块shapes和colors的内容。
- 执行第2条语句后,便可使用模块colors,但只能通过全限定名drawing.colors来使用。
- 执行第3条语句后,便可使用简化名(即shapes)来使用模块shapes。
- 探索模块
# 1. 导入
>>> import copy
# 2. 查明模块包含哪些东西
>>> [n for n in dir(copy) if not n.startswith('_')]
['Error', 'PyStringMap', 'copy', 'deepcopy', 'dispatch_table', 'error', 'name', 't', 'weakref']
# 3. 直接咨询这个模块来获得包含的内容,即共有接口
# 它告诉解释器从这个模块导入所有的名称意味着什么 from copy import *
>>> copy.__all__
['Error', 'copy', 'deepcopy']
# 4. 使用help
>>> help(copy)
>>> 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.
>>> print(copy.copy.__doc__)
Shallow copy operation on arbitrary Python objects.
See the module's __doc__ string for more info.
# 5. 查看源代码
>>> print(copy.__file__)
C:\Python35\lib\copy.py
找到了!你可在代码编辑
标准库的一些模块
- sys
函数/变量 | 描述 |
---|---|
argv | 命令行参数,包括脚本名 |
exit([arg]) | 退出当前程序,可通过可选参数指定返回值或错误消息 |
modules | 一个字典,将模块名映射到加载的模块 |
path | 一个列表,包含要在其中查找模块的目录的名称 |
platform | 一个平台标识符,如sunos5或win32 |
stdin | 标准输入流——一个类似于文件的对象 |
stdout | 标准输出流——一个类似于文件的对象 |
stderr | 标准错误流——一个类似于文件的对象 |
- os
函数/变量 | 描述 |
---|---|
environ | 包含环境变量的映射 |
system(command) | 在子shell中执行操作系统命令 |
sep | 路径中使用的分隔符 |
pathsep | 分隔不同路径的分隔符 |
linesep | 行分隔符(‘\n’、‘\r’或’\r\n’) |
urandom(n) | 返回n个字节的强加密随机数据 |
- fileinput
函数 | 描述 |
---|---|
input([files[, inplace[, backup]]]) | 帮助迭代多个输入流中的行 |
filename() | 返回当前文件的名称 |
lineno() | 返回(累计的)当前行号 |
filelineno() | 返回在当前文件中的行号 |
isfirstline() | 检查当前行是否是文件中的第一行 |
isstdin() | 检查最后一行是否来自sys.stdin |
nextfile() | 关闭当前文件并移到下一个文件 |
close() | 关闭序列 |
在python脚本中添加行号
# numberlines.py
import fileinput
for line in fileinput.input(inplace=True):
line = line.rstrip()
num = fileinput.lineno()
print('{:<50} # {:2d}'.format(line, num))
$ python numberlines.py numberlines.py
添加行号后的行号添加程序
# numberlines.py # 1
# 2
import fileinput # 3
# 4
for line in fileinput.input(inplace=True): # 5
line = line.rstrip() # 6
num = fileinput.lineno() # 7
print('{:<50} # {:2d}'.format(line, num)) # 8
小结
模块:模块基本上是一个子程序,主要作用是定义函数、类和变量等。模块包含测试代码时,应将这些代码放在一条检查name == 'main’的if语句中。如果模块位于环境变量PYTHONPATH包含的目录中,就可直接导入它;要导入存储在文件foo.py中的模块,可使用语句import foo。
探索模块:在交互式解释器中导入模块后,就可以众多不同的方式对其进行探索,其中包括使用dir、查看变量__all__以及使用函数help。文档和源代码也是获取信息和洞见的极佳来源。
标准库:Python自带多个模块,统称为标准库。本章介绍了其中的几个。
- sys:这个模块让你能够访问多个与Python解释器关系紧密的变量和函数。
- os:这个模块让你能够访问多个与操作系统关系紧密的变量和函数。
- fileinput:这个模块让你能够轻松地迭代多个文件或流的内容行。
- sets、heapq和deque:这三个模块提供了三种很有用的数据结构。内置类型set也实现
了集合。 - time:这个模块让你能够获取当前时间、操作时间和日期以及设置它们的格式。
- random:这个模块包含用于生成随机数,从序列中随机地选择元素,以及打乱列表中元
素的函数。 - shelve:这个模块用于创建永久性映射,其内容存储在使用给定文件名的数据库中。
- re:支持正则表达式的模块。