一、模块
1、模块定义
模块是一个包含所有已定义的函数和变量的文件,文件后缀名为.py。模块可以被其他程序引用,以使用该模块下的函数和变量
注意:
- 模块名要遵循Python变量命名规范,不要使用中文、特殊字符;
- 模块名不要和系统模块名冲突,可以先查看系统是否已存在该模块,检查方法是在Python交互环境执行
import abc
,若成功则说明系统已存在此模块;
Python导入模块顺序:
- 当前目录,即当前执行的程序文件所在目录下查找;
- 到 PYTHONPATH(环境变量)下的每个目录中查找;
- 到 Python 默认的安装目录下查找;
以上所有涉及到的目录,都保存在标准模块 sys 的 sys.path 变量中,通过此变量我们可以看到指定程序文件支持查找的所有目录。换句话说,如果要导入的模块没有存储在 sys.path 显示的目录中,那么导入该模块并运行程序时,Python 解释器就会抛出 ModuleNotFoundError(未找到模块)异常。
2、import语句
语法:import module1[, module2[,... moduleN]
不管执行了多少次import语句,一个模块仅会被导入一次
3、from … import 语句
from ... import语句可实现从一个模块中导入指定的部分到当前模块,语法为:
from modname import name1[, name2[, ... nameN]]
4、from … import * 语句
from … import * 语句可实现把一个模块中所有内容均导入到当前模块,语法为:
from modname import *
5、深入模块
模块除了方法定义,还可以包括可执行的代码,这些代码一般用来初始化这个模块,这些代码只有在第一次被导入时才会被执行;
可以使用 import 直接把模块内(函数,变量)名称导入到当前操作模块,这种导入的方法不会把被导入的模块的名称放在当前的字符表中
6、__name__属性
当一个模块被另一个程序第一次引入时,其主程序将运行,如果我们想在模块被引入时,模块中的某一程序块不执行,则可以用__name__属性来使该程序块仅在该模块自身运行时执行
说明: 每个模块都有一个__name__属性,当其值是'__main__'时,表明该模块自身在运行,否则是被引入
"""
__name__属性
当一个模块被另一个程序第一次引入时,其主程序将运行,如果我们想在模块被引入时,模块中的某一程序块不执行,
则可以用__name__属性来使该程序块仅在该模块自身运行时执行
"""
if __name__ == '__main__':
print('程序自身在运行')
else:
print('我来自另一模块')
def sum(num1, num2):
"""加法"""
return print(num1 + num2)
def mult(num1, num2):
"""乘法"""
return print(num1 * num2)
运行using_name.py输出结果:程序自身在运行
另一个模块name.py中引用using_name.py,运行name.py模块,输出结果:我来自另一模块
7、dir() 函数
内置函数 dir() 可以找出模块内定义的所有名称,并以一个字符串列表的形式返回
"""
__name__属性
当一个模块被另一个程序第一次引入时,其主程序将运行,如果我们想在模块被引入时,模块中的某一程序块不执行,
则可以用__name__属性来使该程序块仅在该模块自身运行时执行
"""
if __name__ == '__main__':
print('程序自身在运行')
else:
print('我来自另一模块')
def sum(num1, num2):
"""加法"""
return print(num1 + num2)
def mult(num1, num2):
"""乘法"""
return print(num1 * num2)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'mult', 'sum']
8、Python导入模块的三种方式
解决“Python找不到指定模块”的方法有 3 种,分别是:
- 向 sys.path 中临时添加模块文件存储位置的完整路径;
- 将模块放在 sys.path 变量中已包含的模块加载路径中;
- 设置 path 系统环境变量;
Runoob项目下,存在一个包ZX_package,有个模块“ZX_任意个数的任意次幂求和”,模块中有个函数Sum_Of_Squares,具体路径为:E:\Mine\Python\Runoob\ZX_Package\ZX_任意个数的任意次幂求和.py
另一个模块example.py 程序文件,路径为:C:\Users\mengma\Desktop\example.py
A)、向 sys.path 中临时添加模块文件存储位置的完整路径
模块文件的储存位置,可以临时添加到sys.path中,即向sys.path中添加被导入模块的路(被调用模块“ZX_任意个数的任意次幂求和.py”的存储路径“E:\Mine\Python\Runoob\ZX_Package”),在调用模块的开头位置添加如下代码:
# example.py文件开头
import sys
sys.path.append('E:\\Mine\\Python\\Runoob\\ZX_Package')
路径添加到.py文件的上一级目录(文件夹,即包名package),使用import 模块名导入模块,使用模块名.函数名调用函数
注意:在添加完整路径中,路径中的 '\' 需要使用 \ 进行转义,否则会导致语法错误
B)、将模块放在 sys.path 变量中已包含的模块加载路径中
使用sys.path可输出Python 所有的默认模块加载路径,但通常来说,我们默认将 Python 的扩展模块添加在 lib\site-packages
路径下,它专门用于存放 Python 的扩展模块和包。
使用from 包名 import 模块名导入模块,使用模块名.函数名调用函数
C)、设置环境变量
环境变量中设置用户或者系统变量,变量名输出:PYTHONPATH,变量值输入:.;E:\Mine\Python\Runoob\ZX_Package,其中E:\Mine\Python\Runoob\ZX_Package为包的存储路径
二、包(Package)
1、定义
包是一种管理 Python 模块命名空间的形式,采用"点模块名称",如一个模块的名称是 A.B,则表示一个包 A中的子模块 B 。
注意:
- 每一个包目录下面都会有一个
__init__.py
文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包; -
当使用 from package import item 这种形式的时候,对应的 item 既可以是包里面的子模块(子包),或者包里面定义的其他名称,比如函数、类、变量;
import 语法会首先把 item 当作一个包定义的名称,如果没找到,再试图按照一个模块去导入,如果还没找到,抛出一个 :exc:ImportError 异常。
-
如果使用形如 import item.subitem.subsubitem 这种导入形式,除了最后一项subsubitem,其他都必须是包,而最后一项则可以是模块或者是包,但是不可以是类、函数、变量的名字;
一个包结构:
sound/ 顶层包
__init__.py 初始化 sound 包
formats/ 文件格式转换子包
__init__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
effects/ 声音效果子包
__init__.py
echo.py
surround.py
reverse.py
...
filters/ filters 子包
__init__.py
equalizer.py
vocoder.py
karaoke.py
...
2、包导入子模块
A)、导入子模块echo方法一
语法:
import sound.effects.echo
方法一会导入子模块“sound.effects.echo”,当需要调用echo模块下函数时,必须使用全名访问echo模块下函数,即sound.effects.echo.echofilter(values)
B)、导入子模块echo方法二
语法:
from sound.effects import echo
方法二会导入子模块“echo” ,当需要调用echo模块下函数时,可以使用echo.echofilter(values)
C)、直接导入一个函数或者变量
语法:
from sound.effects.echo import echofilter
方法三会导入子模块“echo” ,因此可以直接使用他的 echofilter() 函数
3、从一个包中导入*
- 导入语句遵循如下规则:如果包定义文件 __init__.py 存在一个叫做 __all__ 的列表变量,那么在使用 from package import * 的时候就把这个列表中的所有名字作为包内容导入,因此需要在更新包以后及时更新__all__ 列表变量
- 推荐使用from Package import specific_submodule。如果在结构中包是一个子包(如sound/filters/vocoder),此时想导入兄弟包(sound/effects/echo),必须使用导入绝对的路径来导入。比如,如果模块sound.filters.vocoder 要使用包 sound.effects 中的模块 echo,就要写成 from sound.effects import echo;
参考文档: