系列
- Python: 学习系列之一:Python能做什么
- Python: 学习系列之二:基础介绍(int/float/string/range/list/tuple/dict/set)
- Python: 学习系列之三:基础介绍二
- Python: 学习系列之四:有趣的经典数学问题
- Python: 学习系列之五:类、继承、多态、封装
- Python: 学习系列之六:对象的内置函数及类对象的特殊方法
- Python: 学习系列之七:模块、PIPY及Anaconda
- Python: 学习系列之八:异常的处理
- Python: 学习系列之九:文件读写
- Python: 学习系列之十:函数
什么是模块
- 一个.py文件就是一个模块
- 在模块中可以定义变量、函数、类等,它们统称为模块的属性
什么是包
- 为了更好的组织和管理模块, Python引入了包
- 在某个目录下添加模块__init__.py之后,该目录就变成了包,因为包是包含特定模块的特殊目录
- 模块__init__.py的作用是初始化所在的包。如果不需要初始化,其内容可以为空。
- 目录支持嵌套,所以包也支持嵌套,包可以包含子包
如何导入模块
当输入"[包名.]模块名."之后,在代码提示中,变量用黄色的v(variable)表示,函数用粉色的f(function)表示,类用蓝色的c( class)表示。
-
导入整个模块
""" import [包名.]模块名 from 包名 import 模块名 """ import os print(os.environ) print(os.getenv('JAVA_HOME')) print(os.MutableMapping) import xml.dom.minidom as n print(xml.dom.minidom.StringTypes) print(n.StringTypes)
-
导入模块中的属性
from os import getenv, environ from os import MutableMapping as m from os import * #导入了所有的属性,不推荐 print(m) print(getenv('JAVA_HOME')) # <class 'collections.abc.MutableMapping'> print(m) # <class 'collections.abc.MutableMapping'>
使用当前项目中的模块
1. 直接导入
2.相对导入, 一个. 表示当前目录,两个..表示当前目录的父目录
注意:当直接运行某个模块时,该 模块就变成了主模块,主模块位于最顶层,与同目录下的其它模块无法构成相对关系,因此,当直接运行某个模块时,该模块不能使用相对导入。
PIPY简介
PYPI的全称是:Python Package Index,它是Python官方的、基于WEB的、集中管理的、第三方的软件仓库。https://pypi.org
如何导入第三方库
如果要使用第三方库,必须先使用工具pip或pip3
# 看到如下界面,说明pip 安装好了
PS C:\Users\cong.wu\Desktop\Test\packageDemo> pip
Usage:
pip <command> [options]
# 版本号
PS C:\Users\cong.wu\Desktop\Test\packageDemo> pip --version
pip 19.1.1 from c:\python37\lib\site-packages\pip (python 3.7)
#安装某个模块
PS C:\Users\cong.wu\Desktop\Test\packageDemo> pip install requests
#安装指定版本某个模块
PS C:\Users\cong.wu\Desktop\Test\packageDemo> pip install requests==1.20.1
#卸载某个模块
PS C:\Users\cong.wu\Desktop\Test\packageDemo> pip uninstall requests
#升级某个模块
PS C:\Users\cong.wu\Desktop\Test\packageDemo> pip install --upgrade requests
#模糊查找某个模块
PS C:\Users\cong.wu\Desktop\Test\packageDemo> pip search requests
#列出所有已安装的第三方库
PS C:\Users\cong.wu\Desktop\Test\packageDemo> pip list
Anaconda
Anaconda是一个开源的包、环境管理器,可以用于在同一个机器上安装不同版本的软件包及其依赖,并能够在不同的环境之间切换,Anaconda包括Conda、Python以及一大堆安装好的工具包,比如:numpy、pandas等,Miniconda包括Conda、Python。
- 访问https://www.anaconda.com安装Anaconda
- 安装完成后,会自动将Anaconda安装目录下的bin目录添加到系统环境变量PATH中,它会使用自带的python,安装第三方库会被安装到Anaconda安装目录下
- Anaconda的第三方库管理工具conda, 类似于工具pip3. 相关命令如下:
#查看帮助信息
conda
# 查看已安装第三方库
conda list
# 搜索第三方库
conda search XXX
# 安装第三方库
conda install XXX
conda install XXX=1.1 #这里只有一个等号
# 升级第三方库
conda update XXX
# 卸载第三方库
conda remove XXX
PYC字节码文件
模块第一次被导入时,它会被编译为PYC字节码文件。pyc字节码文件存放在与该模块同目录下的目录__pycache__中。
运行被导入的模块
导入包中的模块时,会先导入包中的 __init__.py,因此,在运行被导入的模块之前,会从最顶层的父包开始,先依次运行所有的父包中的__init_.py。
查看模块中的所有属性
import mod1
print(dir(mod1)) #查看被引入模块的所有属性
print(dir()) # 查看当前模块的所有属性
如何重新加载已经被导入的模块
在交互式命令行中,使用import语句导入某个模块后,如果对该模块做了修改,然后再次使用import语句导入该模块,那么对模块的修改不会起任何作用。可以调用标准库函数reload重新加载已经被导入的模块。
但在程序中,即.py文件中,不会出现上述的问题。
PS C:\Users\cong.wu\Desktop\Test\packageDemo> python
Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import mod1
>>> mod1.v
14
#对mod1进行修改,将v改成15
>>> import mod1
>>> mod1.v
14 #可以看到这里结果依然是14
>>> import importlib
>>> importlib.reload(mod1) #重新加载后
<module 'mod1' from 'C:\\Users\\cong.wu\\Desktop\\Test\\packageDemo\\mod1.py'>
>>> mod1.v
15
模块的特殊属性之__doc__
"""
模块的特殊属性之__doc__
"""
print(__doc__) # 模块的特殊属性之__doc__
模块的特殊属性之__ name__
"""
1. 对于被导入的模块,其特殊属性__name__的值为模块名
2. 对于直接运行的模块,其特殊属性__name__的值为__main__
"""
import mod1
print(__name__) # __main__
print(mod1.__name__) # mod1
"""
可以根据__name__的值来判断是否执行模块中的测试代码,对于模块中的测试代码,通常当直接运行模块时才需要执行,
而当模块被导入时则不需要执行。
"""
def add(num1: int, num2: int):
print('the result is %i' % (num1+num2))
"""
只有当前模块直接运行时,才会运行如下代码,如果模块被引用,下面这段代码不会被执行
"""
if __name__ == '__main__':
add(1, 2)
模块内的数据访问控制之单下划线 "_"
"""
模块的属性前面加单下划线_ , 这样就无法使用语句"from 模块名 import *"导入相当的属性
但使用语句"import 模块名"依然可以导入所有的属性。
"""
from mod1 import *
print(v) # 15
print(_v) # NameError: name '_v' is not defined
import mod1
print(v) # 15
print(_v) # 15
模块内的数据访问控制之特殊属性__all__
"""
可以在模块内定义特殊属性__all__.这样,可以使用语句"from 模块名 import *"导入特殊属性__all__中定义的属性
但使用语句"import 模块名"依然可以导入所有的属性。
__all__的优先级高于下划线。
"""
"""
mod1.py
__all__=['v','_v']
v=15
_v=15
"""
from mod1 import *
print(v) # 15
print(_v) # 15, 这里依然可以访问到