模块
模块是程序
任何python程序都可以作为模块导入,导入模块多次和导入一次的结果是一样的,如果坚持多次导入,需要用到reload函数。
model1.py
# 简单模块
print("hello, python")
model2.py
import importlib
import model1 # 导入模块时程序被执行 结果: hello, python
import model1 # 再次导入,什么都没有发生
model = importlib.reload(model1) # 重新导入 结果: hello, python
__name__属性
一个模块被另一个程序第一次引入时,其主程序将运行。如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以用__name__属性来使该程序块仅在该模块自身运行时执行。
在模块中定义函数
model3.py
# 包含函数的简单模块
def hello():
if __name__ == '__main__':
print("hello main")
else:
print("hello python")
if __name__ == '__main__':
hello() # hello main
model4.py
import model1
model1.hello() # hello python
模块可用
- 将模块放在正确的位置
site-packages目录是最佳选择,将模块放入该目录中,所有程序就都能将其导入了
import sys, pprint
# 如果你的数据结构过大,不能在一行打完,可以使用pprint模块中的pprint函数智能打印
pprint.pprint(sys.path)
# 结果展示
"""
['D:\\pythonspace\\pythontest',
'D:\\pythonspace\\pythontest',
'D:\\pythonspace\\pythontest\\venv\\Scripts\\python37.zip',
'D:\\python1\\DLLs',
'D:\\python1\\lib',
'D:\\python1',
'D:\\pythonspace\\pythontest\\venv',
'D:\\pythonspace\\pythontest\\venv\\lib\\site-packages']
"""
包
目录只有包含一个叫做 __init__.py 的文件才会被认作是一个包,最简单的情况,放一个空的 :file:__init__.py就可以了。当然这个文件中也可以包含一些初始化代码或者为(将在后面介绍的) __all__变量赋值。
简单包布局
文件/目录 | 描述 |
---|---|
`\pythontest\drawing | 包目录 |
`\pythontest\drawing\__init__.py | 初始化drawing包 |
`\pythontest\drawing\model3.py | model3模块 |
`\pythontest\drawing \model4.py | model4模块 |
导入子模块
import drawing.model3 as m3
from drawing import (model3, model4)
m3.hello() # Hello I'm model3
model3.hello() # Hello I'm model3
model4.hello() # Hello I'm model4
探究模块
- 使用dir
查看模块包含的内容可以使用dir函数
import copy
print(dir(copy))
# 打印 模块外部方法
print([n for n in dir(copy) if not n.startswith("_")])
- __all__函数
import copy
# __all__定义了模块公有接口,也就是从模块导入所有名字代表什么含义
print(copy.__all__) # ['Error', 'copy', 'deepcopy']
- 使用help获取帮助
# help 函数
help(copy.copy)
"""
copy(x)
Shallow copy operation on arbitrary Python objects.
See the module's __doc__ string for more info.
"""
- 文档
# 文档
print(copy.copy.__doc__)
- 使用源代码
# 查找源码
print(copy.__file__)
标准库
1.sys
sys这个模块让你能够访问与python解释器联系紧密的变量和函数
sys模块中一些重要的函数和变量
函数/变量 | 描述 |
---|---|
argv | 命令行参数,包括脚本名称 |
exit([argv]) | 退出当前程序,可选参数为给定的返回值或者错误信息 |
modules | 映射模块名字到载入模块的字典 |
path | 查找模块所在目录的目录名列表 |
stdin | 标准输入流 |
stdout | 标准输出流 |
stderr | 标准错误流 |
2.os
os模块提供了访问多个操作系统服务的功能
os模块中一些重要的函数和变量
函数/变量 | 描述 |
---|---|
environ | 对环境变量进行映射 |
system(command) | 在子shell中执行操作系统命令 |
sep | 路径中的分隔符 |
pathsep分隔路径的分隔符 | |
linesep | 行分隔符 |
3.fileinput
fileinput模块让你能够轻松的遍历文本文件的所有行
fileinput.input 它会返回能够用于for循环遍历的对象,如果不想使用默认行为可以更改参数
基本格式
fileinput.input([files[, inplace[, backup[, bufsize[, mode[, openhook]]]]]])
默认
fileinput.input (files=None, inplace=False, backup=’’, bufsize=0, mode=‘r’, openhook=None)
files: #文件的路径列表,默认是stdin方式,多文件['1.txt','2.txt',...]
inplace: #是否将标准输出的结果写回文件,默认不取代
backup: #备份文件的扩展名,只指定扩展名,如.bak。如果该文件的备份文件已存在,则会自动覆盖。
bufsize: #缓冲区大小,默认为0,如果文件很大,可以修改此参数,一般默认即可
mode: #读写模式,默认为只读
openhook: #该钩子用于控制打开的所有文件,比如说编码方式等;
fileinput.filename 返回当前正在处理的文件名
fileinput.lineno 返回当前行的行数,这个数值是累计的,完成上一个文件的处理并且开始处理下一个文件的时候,行数并不会重置
fileinput.filelineno 返回当前行的行数,每次处理完一个文件并且开始处理下一个文件时,行数都会重置为1
fileinput.isfirseline 在当前行是当前文件的第一行时返回真值,反之返回假值
fileinput.nextfile 会关闭当前文件,跳到下一个文件,跳过的行并不记
fileinput.close 关闭整个文件链,结束迭代
fileinput.filename函数返回当前正在处理的文件名
test.txt
java
python
shell
import fileinput
# 遍历文件每一行
def ergodic():
for line in fileinput.input("test.txt"):
print(line)
# 利用fileinput实现文件内容替换,并将原文件作备份
def backups():
for line in fileinput.input("test.txt", backup = "bak", inplace=True):
print(line.rstrip().replace("shell", "c/c++"))
4.双端队列
双端队列可通过可迭代对象比如(集合)创建
from _collections import deque
# 双端队列
q = deque(range(5))
# 队列右侧增减元素
q.append(5) # deque([0, 1, 2, 3, 4, 5])
# 队列左侧增加元素
q.appendleft(6) # deque([6, 0, 1, 2, 3, 4, 5])
# 队列左侧弹出元素
q.popleft() # deque([0, 1, 2, 3, 4, 5])
# 旋转元素
q.rotate() # deque([5, 0, 1, 2, 3, 4])
q.rotate(-1) # deque([0, 1, 2, 3, 4, 5])
q.rotate(1)# deque([5, 0, 1, 2, 3, 4])
5.time
time模块可获得当前时间,操作时间和日期,从字符串读取时间以及格式化时间为字符串
函数 | 描述 |
---|---|
asctime([tuple]) | 将时间元组转换为字符串 |
localtime([secs]) | 将秒数转换为日期元组,以本地时间为准 |
mktime(tuple) | 将时间元组转换为本地时间 |
sleep(secs) | 休眠secs秒 |
strptime(string[, format]) | 将字符串解析为时间元组 |
time() | 当前utc时间 |
6.random
random模块包括返回随机数的函数,可以用于模拟或者用于产生任何随机输出程序
函数 | 描述 |
---|---|
random() | 返回0<n<=1之间的随机数n |
gerrandbits(n) | 以长整型形式返回n个随机位 |
uniform(a, b) | 返回随机实数n,其中a<=n<b |
randrange([start], stop, [step]) | 返回range([start], stop, [step])中的随机数 |
choice(seq) | 从序列seq中返回随意元素 |
sample(seq, n) | 从序列seq中中选择n个随机独立的元素 |