Python模块相关概念
- Python 程序由模块组成。一个模块对应 python 源文件,一般后缀名是:.py。
- 模块由语句组成。运行 Python 程序时,按照模块中语句的顺序依次执行。
- 语句是 Python 程序的构造单元,用于创建对象、变量赋值、调用函数、控制语句等。
模块化编程的一般流程:
- 设计 API,进行功能描述。
- 编码实现 API 中描述的功能。
- 在模块中编写测试代码,并消除全局代码。
- 使用私有函数实现不被外部客户端调用的模块函数。
help(模块名)
查看模块的API。
import math
help(math)
__doc__
模块的第一行增加一个文档字符串,用于描述模块的相关功能,通过__doc__
获得模块的文档字符串。
###Salary.py
#encoding:utf-8
"""本模块用于计算公司员工的薪资 """
company = "company"
def yearSalary(monthSalary):
"""根据传入的月薪,计算出年薪"""
pass
def daySalary(monthSalary):
"""根据传入的月薪,计算出每天的薪资"""
pass
###test.py
import Salary
print (Salary.__doc__)
print (Salary.daySalary.__doc__)
##print
本模块用于计算公司员工的薪资
根据传入的月薪,计算出每天的薪资
__name__
仅有一个例外,就是当一个模块被作为程序入口时(主 程序、交互式提示符下),它的__name__
的值为“__main__
”。我们可以根据这个特点,将模块源代码文件中的测试代码进行独立的处理。
#encoding:utf-8
"""本模块用于计算公司员工的薪资 """
company = "北京尚学堂"
def yearSalary(monthSalary):
"""根据传入的月薪,计算出年薪"""
return monthSalary*12
def daySalary(monthSalary):
"""根据传入的月薪,计算出每天的薪资"""
return monthSalary/30
if __name__ == '__main__': #测试代码
print (yearSalary(3000))
print (daySalary(3000))
##print
36000
100
模块导入
import 语句导入
import
本质上是使用了内置函数 __import__()
import 模块时被python 解释器生成一个模块对象。
模块起别名,本质上,仅仅是新创建一个变量引用于加载的模块对象
import语法
import 模块名 #导入一个模块
import 模块 1,模块 2… #导入多个模块
import 模块名 as 模块别名 #导入模块并使用新名字
import 加载的模块分为四个通用类别:
a.使用 python 编写的代码(.py 文件);
b.已被编译为共享库或 DLL 的 C 或 C++扩展;
c.包好一组模块的包
d.使用 C 编写并链接到 python 解释器的内置模块;
例子:
#encoding=utf-8
import math
print(id(math))
print(type(math))
print(math.pi) #通过 math.成员名来访问模块中的成员
##print
43475448
<type 'module'>
3.14159265359
from…import 导入
from 模块名 import 成员 1,成员 2,…
#导入一个模块中的所有成员
from 模块名 import *
注:尽量避免“from 模块名 import *
”这种写法。*
它表示导入模块中所有的不是以下划线(_
)开头的名字都导入到当前位置。 但你不知道你导入什么名字,很有可能 会覆盖掉你之前已经定义的名字。而且可读性极其的差。
import 语句和 from…import 语句的区别
import
导入的是“文件”,from...import
导入的是文件下的“内容”
__import__()
动态导入(不建议)
给 __import__()
动态传递不同的的参数值,就能导入不同的模块。
#encoding=utf-8
s = "math"
m = __import__(s) #import math as m
print(m.pi)
##print
3.14159265359
注意:一般不建议自行使用__import__()
导入,其行为在 python2 和 python3 中有差异,会导致意外错误。如果需要动态导入可以使用 importlib 模块。
importlib模块
import importlib
a = importlib.import_module("math")
print(a.pi)
模块的加载问题
多次导入模块只会执行一次,保证了在整个解释器进程内有且仅有一个实例对象。
重新加载importlib.reload()
有时候我们确实需要重新加载一个模块,这时候可以使用:importlib.reload()
方法。
包 package
包就是一个必须有__init__.py
的文件夹。包下面包含“模块(module)”,也可以再包含子包(subpackage)”
典型结构如下:
导入包操作
导入包的本质其实是“导入了包的__init__.py
文件。
例如上图中的包结构,我们需要导入 module_AA.py。
1. import a.aa.module_AA
在使用时必须加完整名称来引用。
比如:a.aa.module_AA.fun_AA()
2. from a.aa import module_AA
在使用时直接可以使用模块名。
比如:module_AA.fun_AA()
3. from a.aa.module_AA import fun_AA
直接导入函数 在使用时直接可以使用函数名。
比如:fun_AA()
注:
1. from package import item
这种语法中,item 可以是包、模块、函数、 类、变量。
2. import item1.item2
这种语法中,item 必须是包或模块,不能是其他。
__init__.py
的三个核心作用:
1. 作为包的标识,不能删除。
2. 用来实现模糊导入
3. 导入包实质是执行__init__.py
文件,可以在__init__.py
文件中做这个包的初始化、以及需要统一执行代码、批量导入。
import *(不建议用)
理论上是希望文件系统找出包中所有的子模块,然后导入它们。 这可能会花长时间等。Python 解决方案是提供一个明确的包索引。这个索引由 __init__.py
定义 __all__
变量,该变量为一列表,如上例 a 包下的 __init__.py
中,可定义 __all__ = ["module_A","module_A2"]
这意味着, from sound.effects import *
会从对应的包中导入以上两个子模块;
包内引用
子包内的引用,可以按相对位置引入子模块。
以 aa 包下的 module_AA 中导入 a 包下内容为例:
from .. import module_A #..表示上级目录 .表示同级目录
from . import module_A2 #.表示同级目录
sys.path 和模块搜索路径
导入某个模块文件时, Python 解释器去哪里找这个文件呢?一般按照如下路径寻找模块文件(按照顺序寻找,找到就不在往下找)
1. 内置模块
2. 当前目录(当前程序目录)
3. 程序的主目录(程序所在项目的根目录)
4. pythonpath
目录(如果已经设置了 pythonpath
环境变量)
5. 标准链接库目录
6. 第三方库目录(site-packages
目录)
7. .pth
文件的内容(如果存在的话)
8. sys.path.append()
临时添加的目录
当任何一个 python 程序启动时,就将上面这些搜索路径(sys.path包括除内置模块以外的路径)进行收集, 放到 sys 模块的 path 属性中(sys.path)。
pythonpath 环境变量
window中高级系统设置→环境变量,设置完要重启IDE
.pth 文件的写法
我们可以在 site-packages
目录下添加.pth 文件。并在文件中增加内容:
#一行一个目录!
g:\a
g:\b
g:\c
注:
1. 需确保 g:\a,g:\b,g:\c 对应的目录真实存在。
2. 在 windows 系统中建立**.pth** 文件,由于没有文件名不能直接建立。需要输入:“.pth.”才能正常建立.pth 文件。
使用 sys.path 查看和临时修改搜索路径
#test_path.py文件内容
#encoding=utf-8
import sys
sys.path.append("d:/")
print(sys.path)
##print
[
#当前目录
'D:\\PythonStudy\\PythonProject\\pythonProject\\music\\music_name',
#程序的主目录
'D:\\PythonStudy\\PythonProject\\pythonProject',
#pythonpath 目录(如果已经设置了 pythonpath 环境变量)
'D:\\pythonmodel',
#标准链接库目录
'C:\\Users\\12784\\AppData\\Local\\Programs\\Python\\Python310\\python310.zip',
'C:\\Users\\12784\\AppData\\Local\\Programs\\Python\\Python310\\DLLs',
'C:\\Users\\12784\\AppData\\Local\\Programs\\Python\\Python310\\lib',
'C:\\Users\\12784\\AppData\\Local\\Programs\\Python\\Python310',
#第三方库目录site-packages(如果 pycharm 项目建立了 venv 虚拟环境,则是 venv 目录)
'D:\\PythonStudy\\PythonProject\\pythonProject\\venv',
'D:\\PythonStudy\\PythonProject\\pythonProject\\venv\\lib\\site-packages',
#.pth 文件中列出的目录
'D:\\PythonStudy\\.pthtest\\a',
'D:\\PythonStudy\\.pthtest\\b',
#sys.path.append()临时添加的目录
'd:/']
库(Library)
Python 中库是借用其他编程语言的概念,没有特别具体的定义。库强调的是功能性,而不是代码组织。我们通常将某个功能的“模块的集合”, 称为库。
标准库(Standard Library)
Python 标准库的主要功能有:
1. 文本处理,包含文本格式化、正则表达式匹配、文本差异计算与合并、Unicode 支 持,二进制数据处理等功能
2. 文件处理,包含文件操作、创建临时文件、文件压缩与归档、操作配置文件等功能
3. 操作系统功能,包含线程与进程支持、IO 复用、日期与时间处理、调用系统函数、 日志(logging)等功能
4. 网络通信,包含网络套接字,SSL 加密通信、异步网络通信等功能
5. 网络协议,支持 HTTP,FTP,SMTP,POP,IMAP,NNTP,XMLRPC 等多种网络协议,并提供了编写网络服务器的框架
6. W3C 格式支持,包含 HTML,SGML,XML 的处理 7. 其它功能,包括国际化支持、数学运算、HASH、Tkinter 等
第三方扩展库
PyPI官网:https://pypi.org
PyPI(Python Package Index)是 python 官方的第三方库的仓库,所有人都可以下载第三 方库或上传自己开发的库到 PyPI。PyPI 推荐使用 pip 包管理器来下载第三方库。
pip 是一个现代的,通用的 Python 包管理工具。提供了对 Python 包的查找、下载、安 装、卸载的功能。
python 2.7.9 和 3.4 以后的版本已经内置pip 程序。
第三方库安装方式
1.命令行安装
pip install 库名 #安装
pip show 库名 #安装后确认
- Pycharm 中直接安装到项目中
在 Pycharm 中,依次点击:file–>setting–>Project 本项目名–>Project Interpreter。点击“+”,然后输入要安装的第三方库“pillow”,再点击按钮“Install Package”,等待 安装即可,几秒种后,即提示安装成功: