1. 模块与包
1.1 模块
每一个以.py结尾的Python文件都是一个模块
模块名同样也是一个标识符,需要符合标识符的命名规则(一般全小写,不使用下划线)
使用模块的功能需要先导入模块,在模块中定义的全局变量、函数、类都可以导入使用
导入模块有两种形式:
import moudle(需要使用模块名.的形式使用其功能)
from moudle import xxx(不需要使用模块名.的形式使用其功能,可直接使用)
import module # 导入整个模块,使用相关功能时使用module.的形式
import module as xxx # 导入模块并赋予别名,使用相关功能时使用别名.的形式
from module import * # 从模块中导入所有功能,使用时直接用功能名即可(不建议使用)
from module import xxx as yyy # 从模块中导入某个功能并取别名,使用时使用别名即可
from module import xxx # 从模块中导入某个功能,使用时直接用功能名称即可
注意:
模块名一定不要与python的内置模块重名,避免发生冲突!
如果导入的两个模块存在同名的函数,那么后导入模块的函数会覆盖掉先导入的函数
导入模块时的搜索顺序:
首先在当前目录下搜索该模块,有就直接导入
当前目录没有,搜索系统路径
import sysprint(sys.path)
模块测试接口:
一般情况下,模块的末尾都有下面一行代码:
if __name__ == "__main__": main()
这行代码就是用来方便用户测试自己写的脚本的功能。这句话通过判断__name__变量的值来判断模块是被导入还是自己执行。
作为脚本执行时,__name__变量值为__main__,可以执行下方测试代码
作为模块被导入时,__name__变量为模块名,下方测试代码不执行
注意:模块被导入时,模块内直接执行的代码会在导入时执行一次(因此建议将模块测试的代码写在if__name__ == "__main__"语句块中)
模块的推荐写法:
# 导入模块
# 定义全局变量
# 定义类
# 定义函数
# 在代码的最下方
def main():
# ...
pass
# 根据 __name__ 判断是否执行下方代码
if __name__ == "__main__":
main()
1.2 包
python中包是一个包含多个python文件的特殊目录。使用包来组织模块,避免模块名冲突。(包名使用字母、下划线组成)
除此之外,包目录下一般有一个__pycache__目录,该目录会缓存每个模块编译后的文件(.pyc文件,加快执行速度)。执行某个模块时,会检查源文件与编译版文件的修改日期确定是否需要重新编译。
注意:
包目录下一定有一个__init__.py文件,该文件表示当前目录是一个包
__init__.py文件内部应指定对外部提供的模块列表
# 从 当前目录 导入 模块列表from . import send_messagefrom . import receive_message
1.3 发布模块
创建setup.py文件:
from distutils.core import setup
setup(name="hm_message", # 包名
version="1.0", # 版本
description="itheima's 发送和接收消息模块", # 描述信息
long_description="完整的发送和接收消息模块", # 完整描述信息
author="itheima", # 作者
author_email="itheima@itheima.com", # 作者邮箱
url="www.itheima.com", # 主页
py_modules=["hm_message.send_message", "hm_message.receive_message"]) # 模块列表
构建模块
$ python3 setup.py build
生成发布压缩包
$ python3 setup.py sdist
安装模块:
$ tar -zxvf hm_message-1.0.tar.gz
$ sudo python3 setup.py install
2. 常用内置模块
2.1 os模块
os模块封装了多个与操作系统相关的函数。
os模块:import os
os.name:操作系统类型
os.uname():操作系统信息
os.environ:环境变量(字典形式)
os.environ.get(key):根据键取某个环境变量的值
os.listdir(path_str):列出目录下的文件及目录
os.chdir(path_str):改变当前目录
os.mkdir(path_str):创建一个目录(单层目录)
os.rmdir(path_str):删除空目录
os.makedirs(path_str):递归创建目录(多层目录)
os.removedirs(path_str):递归删除目录及文件
os.remove(path_str):删除文件
os.rename(src, dst):重命名文件或目录
os.chmod(path, mode):修改文件权限
os.chown(path, uid, gid):修改文件所有者、所属组
os.stat(path_str):查看文件详细信息
os.symlink(src, dst):为文件创建软链接
os.getcwd():获取当前目录
os.getpid():获取当前进程ID
os.getppid():获取父进程ID
os.kill():杀死进程
os.path: import os.path os.path.basename(path_str):获取路径的最后一个组成部分 os.path.dirname(path_str):返回路径中的目录结构(仅目录) os.path.abspath(path_str):返回目录的绝对路径 os.path.join(path_str, path_str):拼接路径 os.path.split(path_str):拆分路径,拆分出最后一个 os.path.splitext(path_str):获取文件扩展名 os.path.exist(path_str):判断文件或目录是否存在 os.path.isfile(path_str):判断是否为文件 os.path.isdir(path_str):判断是否为目录
shutil模块:import shutil shutil.copy(src, dst):复制文件或目录 shutil.move(src, dst):移动或重命名文件或目录 shutil.copyfile():复制文件
2.2 日期时间模块
time模块
time模块包含多个有关时间处理的函数。
time模块:import time time.time():返回以秒为单位的浮点数时间(unix时间戳,从1970-01-01 00:00:00 UTC) time.clock():返回处理器时间(time.process_time()) time.sleep():休眠 time.ctime():将以秒表示的时间(time.time())转换为当地时间的字符串 time.localtime():将秒为单位的时间转换为表示当地时间的时间元组 time.gmtime():将秒为单位的时间转换为UTC时间的时间元组 time.asctime():将时间元组转换为当地时间的字符串
datetime模块包含多个日期时间处理的函数。
datetime模块:from datetime import datetime datetime.now():返回一个datetime对象,表示当地时间 datetime.utcnow():返回一个datetime对象,表示UTC时间 object_datetime.timestamp():将一个datetime对象转换为unix时间戳 datetime.fromtimestamp():将Unix时间戳转换为datetime对象 datetime.strftime():将datetime对象格式化输出为字符串 datetime.strptime():将时间字符串转换为datetime对象
from datetime import datetime
print(datetime.now()) # 返回一个datetime对象,表示当地时间
print(datetime.utcnow()) # 返回一个datetime对象,表示UTC时间
test_time = datetime.utcnow()
print(test_time.timestamp()) # 将一个datetime对象转换为unix时间戳
print(datetime.fromtimestamp(1525849091.98994)) # 将Unix时间戳转换为datetime对象
print(datetime.strftime(datetime.now(), '%Y-%m-%d %H:%M:%S.%f')) # 将datetime对象格式化输出为字符串
print(datetime.strptime('2018-05-09 23:04:12.119774', '%Y-%m-%d %H:%M:%S.%f')) # 将时间字符串转换为datetime对象
# 结果
2018-05-09 23:14:51.708639
2018-05-09 15:14:51.708639
1525850091.708639
2018-05-09 14:58:11.989940
2018-05-09 23:14:51.708639
2018-05-09 23:04:12.119774
2.3 collections模块(容器数据)
collections模块实现了特定目标的容器,以提供Python标准内建容器dict, list, set, 和tuple的替代选择。
namedtuple
命名元组,可用来创建一个自定义的tuple对象。其可规定元素的个数,并可使用属性来访问某个元素。(索引同样适用)
语法:collections.namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)
import collections
Circle = collections.namedtuple('Circle', ['x', 'y', 'z'])
print(isinstance(Circle, tuple))
circle = Circle(5, 6, 7)
print(circle.x, circle.y, circle.z)
# 执行结果
False
5 6 7
deque
deque是可实现高效插入和删除的双向列表,适合用于队列和栈。deque不仅实现了list的append和pop,还支持appendleft()和popleft().
语法:collections.deque([iterable[, maxlen]])
返回一个新的双向队列对象,从左到右初始化(使用append方法) ,从 iterable数据创建。如果 iterable 没有指定,新队列为空。
import collections
deque_list = collections.deque([1, 2, 3])
print(type(deque_list))
deque_list.appendleft(5)
deque_list.append(6)
print(deque_list)
# 执行结果
# <class 'collections.deque'>
deque([5, 1, 2, 3, 6])
2.4 sys模块
sys模块提供系统相关的参数和函数。
sys.argv
sys.argv用于获取输入的命令行参数。
argv[0] 为脚本的名称(是否是完整的路径名取决于操作系统)。如果没有脚本名被传递给Python解释器, argv[0] 为空字符串。
sys.path
sys.path获取模块的搜索路径。
2.5 urllib模块
urllib提供了一系列操作URL的功能,可用来模拟浏览器执行get post等请求。
from urllib import request
with request.urlopen("http://www.baidu.com") as f:
data = f.read()
print("status:", f.status, f.reason)
for k, v in f.getheaders():
print("%s: %s" % (k, v))
print('Data:', data.decode('utf-8'))
python培训:http://www.baizhiedu.com/python2019