目录
1. python中的模块是什么
2. 导入模块: 学习import语句
2.1 import语句介绍
2.2 import导入模块的语法
2.3 导入自己的模块
2.4 导入数字开头或者带空格的模块
3. 编写自定义模块
3.1 给自定义模块编写测试代码
3.2 给自定义模块模块编写说明文档
4. 模块的搜索路径
4.1 Python解释器查找模块路径的方式
4.2 设置模块搜索路径: 临时添加模块完整路径
4.3 设置模块搜索路径: 将模块保存到指定位置
4.4 设置模块搜索路径: 环境变量
5. Python的包
5.1 包的概念介绍
5.2 创建包
5.3 导入包
5.4 Python查看模块(变量、函数、类)方法
6. Python第三方库(模块)下载
Python 语言之所以能被广泛应用于各行各业,在很大程度上得益于它的模块化系统。
在Python的标准安装中包含了一组自带的模块,这些模块被称为“标准库”。
Python 3 的标准库官方参考链接:
https://docs.python.org/3/library/index.html
更重要的是,开发者完全可以根据自己的需要不断地为 Python 增加扩展库。各行各业的 Python 用户贡献了大量的扩展库,这些扩展库极大地丰富了 Python 的功能,这些扩展库从某种程度上也形成了 Python 的“生态圈”。
1. python中的模块是什么?
模块的英文为 Modules,在python中,一个文件(以“.py”为后缀名的文件)就叫做一个模块,模块就是 Python 程序,任何 Python 程序都可以作为模块,包括在前面章节中写的所有 Python 程序,都可以作为模块。
每一个模块在python里都被看做是一个独立的文件,模块可以被项目中的其他模块、一些脚本甚至是交互式的解析器所使用,它可以被其他程序引用,从而使用该模块里的函数等功能,使用Python中的标准库也是采用这种方法。
Python 提供了强大的模块支持,主要体现在,不仅 Python 标准库中包含了大量的模块(称为标准模块),还有大量的第三方模块,开发者自己也可以开发自定义模块,通过这些强大的模块可以极大地提高开发者的开发效率。
在编写Python程序时,随着程序功能的增加,程序体积会不断变大,为了便于维护,通常会将其分为多个文件(模块),这样不仅可以提高代码的可维护性,还可以提高代码的可重用性。
代码的可重用性体现在: 当编写好一个模块后,只要编程过程中需要用到该模块中的某个功能(由变量、函数、类实现),无需做重复性的编写工作,直接在程序中导入该模块即可使用该功能。
在Python中模块分为以下几种:
(1)、系统内置标准模块:例如:sys、time、json模块等等;
(2)、自定义模块:自定义模块是自己写的模块,对某段逻辑或某些函数进行封装后供其他函数调用。
注意:自定义模块的命名一定不能和系统内置的模块重名,否则将不能再导入系统的内置模块。例如:自定义了一个sys.py模块后,再想使用系统的sys模块是不能使用的;
(3)、第三方的开源模块:这部分模块可以通过pip install进行安装,有开源的代码;
2. 导入模块: 学习import语句
2.1 import语句介绍
如果想在当前 Python 源文件里使用另一个Python源文件的函数代码,只需要在当前Python源文件里执行 import语句,导入模块即可。import语句可以出现在程序中的任何位置,但最好把导入模块放在代码的开头。
import跟C/C++中的#include作用有点类似,都是为了调用定义在其他文件中的变量、函数或者类,但实现的区别很大。
当解释器遇到 import 语句,如果模块在当前的搜索路径就会被导入。
一个模块只会被导入一次,不管你执行了多少次import,这样可以防止导入模块被一遍又一遍地执行。
2.2 import导入模块的语法
import 导入模块的语法主要有以下两种:
第一种: import 模块名1 [as 别名1], 模块名2 [as 别名2],…
使用这种语法格式的 import 语句,会导入指定模块中的所有成员(包括变量、函数、类等)。
当需要使用模块中的成员时,需用该模块名(或别名)作为前缀,否则 Python 解释器会报错。注意,用 [] 括起来的部分,可以使用,也可以省略。--->可以起,也可以不起花名
示例代码: 导入模块
#!/usr/bin/python3 import math #导入math模块:模块里面包含了一些数学运算的函数 data=math.pow(10,2) #pow(x,y)函数是求x的y次方的值 print(data) #输出结果: 100.0 |
示例代码: 使用别名
#!/usr/bin/python3 #导入math模块:模块里面包含了一些数学运算的函数 import math as wbyq #使用别名 data=wbyq.pow(10,4) #pow(x,y)函数是求x的y次方的值 print(data) #输出结果: 10000.0 |
第二种: from 模块名 import 成员名1 [as 别名1],成员名2 [as 别名2],…
使用这种语法格式的 import 语句,只会导入模块中指定的成员,而不是全部成员(部分导出)。当程序中使用该成员时,无需附加任何前缀,直接使用成员名(或别名)即可。注意,用 [] 括起来的部分,可以使用,也可以省略。
示例代码: 导入模块里指定的成员
#!/usr/bin/python3 from math import pow #导入math模块中指定的成员 data=pow(10,4) #pow(x,y)函数是求x的y次方的值 print(data) #输出结果: 10000.0 |
示例代码: 使用别名
#!/usr/bin/python3 from math import pow as wbyq #导入math模块中指定的成员,使用别名 data=wbyq(10,2) #wbyq(x,y)函数是求x的y次方的值print(data) #输出结果: 100.0 |
在使用import语句的时候,Python解释器会根据搜索路径找到对应的文件,搜索路径是在Python编译或安装的时候确定的,搜索路径被存储在sys模块中的path变量。sys.path 输出是一个列表,其中第一项是空串'',代表当前目录,如果使用脚本执行上面代码,就能输出确定的路径。
示例代码:
#!/usr/bin/python3 import sys #导入sys模块 print(sys.path) |
2.3 导入自己的模块
前面说过,模块就是 Python 程序,任何 Python 程序都可以作为模块,下面就简单的创建一个自定义模块,导入使用。
先在任意目录下创建一个hello.py文件,写入以下测试代码:
#!/usr/bin/python3 def wbyq(): print("hello world.") |
在hello.py文件相同目录下,在创建一个python_code.py文件,引用hello模块:
#!/usr/bin/python3 import hello #导入hello模块 hello.wbyq() |
运行python_code.py文件,输出结果:
hello world.
2.4 导入数字开头或者带空格的模块
在上一小节编写自己模块之后,可以体会到,其实模块就是一个python代码文件,因此要求其文件名要符合操作系统的命名规则。
这可能会遇到一个问题,比如: windows操作系统中允许文件名中包含空格,也就是说,模块文件可以起名为类似“he llo”的形式。但这和 Python 语法相矛盾,Python 是以空格来隔离一行语句中的不同元素,如果模块名中出现空格,就无法再使用 import 引入,如果模块名称以数字开头,也无法使用 import 语句正常导入。
针对以上情况,如果模块中包含空格或者以数字开头,就需要使用Python 提供的 __import__() 内置函数引入模块。
例如: 导入he llo模块
#!/usr/bin/python3 #导入he llo模块 hello=__import__("he llo") #调用模块里的成员 print(hello.data) print(hello.list) |
3. 编写自定义模块
3.1 给自定义模块编写测试代码
在上面章节里已经编写了一个简单的自定义模块加载例子,但是没有编写测试代码。正常情况下,当自定义模块编写完成之后,需要编写一些测试代码,检验模块中各个功能是否都能正常运行。
例如:先在任意目录下创建一个hello.py文件,写入以下测试代码:
#!/usr/bin/python3 data=1234 list=['1','2','3','4','5','6'] def func(): print("我是自定义模块") print("data=",data) print("list=",list) func() #调用函数 |
在hello.py文件相同目录下,再创建一个python_code.py文件,引用hello模块:
#!/usr/bin/python3 import hello #导入hello模块 |
运行python_code.py文件:
data= 1234 list= ['1', '2', '3', '4', '5', '6'] 我是自定义模块 |
测试结果发现,导入hello模块时,原来hello里编写的测试代码会自动执行,这显然不是期望看到的结果。
我们希望的效果是:如果直接运行模块文件(相当于测试文件),程序会执行该模块的测试函数;如果是其他程序导入该模块,程序不应该执行该模块的测试函数。
要实现这个效果,需要借助 Python 内置的 __name__ 变量,当直接运行一个模块时,name 变量的值为 __main__;而将模块被导入其他程序中并运行该程序时,处于模块中的 __name__ 变量的值就变成了模块名。
因此,如果希望测试函数只有在直接运行模块文件时才执行,则可在调用测试函数时增加判断,即只有当 __name__ =='__main__' 时才调用测试函数。
示例: 改写hello.py代码
#!/usr/bin/python3 data=1234 list=['1','2','3','4','5','6'] def func(): print("我是自定义模块") #以下是测试代码 if __name__=='__main__': #只有当 __name__ =='__main__' 时才调用测试函数 print("data=",data) print("list=",list) func() #调用函数 #本模块被执行时, __name__才等于__main__ #当该模块被其他模块引用时,__name__的值就是模块名,所以其他模块引用该模块时 #不会执行测试代码 |
示例: 改写python_code.py
#!/usr/bin/python3 import hello #导入hello模块 #调用模块里的成员 #print(hello.data) #print(hello.list) #hello.func() |
修改完成后,再次执行模块文件(hello.py),测试代码会执行;而执行导入模块文件的python_code.py,模块中的测试代码不会执行。
3.2 给自定义模块模块编写说明文档
在实际开发中编写自定义模块时,应该为模块编写说明文档;否则,其他开发者将不知道该模块有什么作用,以及包含哪些功能。
为模块编写说明文档,只要在模块开头的位置定义一个字符串即可。
例如: 在上面程序hello.py的第一行代码之前添加下面的内容
"""这是自己编写自定义模块模块的功能是: 学习自定义模块使用 其中: data 是一个变量 list 是一个列表 func 是一个函数""" #!/usr/bin/python3 data=1234 list=['1','2','3','4','5','6'] def func(): print("我是自定义模块") #以下是测试代码 if __name__=='__main__': #只有当 __name__ =='__main__' 时才调用测试函数 print("data=",data) print("list=",list) func() #调用函数 #本模块被执行时, __name__才等于__main__ #当该模块被其他模块引用时,__name__的值就是模块名,所以其他模块引用该模块时 #不会执行测试代码 |
在python_code.py代码里调入hello模块,打印hello模块的帮助文档:
#!/usr/bin/python3import hello #导入hello模块 #打印模块的帮助信息print(hello.__doc__) |
输出:
这是自己编写自定义模块模块的功能是: 学习自定义模块使用 其中: data 是一个变量 list 是一个列表 func 是一个函数 |
4. 模块的搜索路径
4.1 Python解释器查找模块路径的方式
通常情况下,当使用 import 语句导入模块后,Python 会按照以下顺序查找指定的模块文件:
(1)、在当前目录,即当前执行的程序文件所在目录下查找;
(2)、到 PYTHONPATH(环境变量)下的每个目录中查找;
(3)、到 Python 默认的安装目录下查找。
以上所有涉及到的目录,都保存在标准模块 sys 的 sys.path 变量中,通过此变量,可以输出指定程序文件支持查找的所有目录。
因此,如果要导入的模块没有存储在 sys.path 显示的目录中,那么导入该模块并运行程序时,Python 解释器会抛出 ModuleNotFoundError(未找到模块)异常。
为了让 Python 能找到自定义(或第三方提供) 的模块,可以用以下 3 种方式来告诉它:
(1)、向 sys.path 中临时添加模块文件存储位置的完整路径。
(2)、将模块放在 sys.path 变量中已包含的模块加载路径中。
(3)、设置系统环境变量。
4.2 设置模块搜索路径: 临时添加模块完整路径
先在任意目录下创建一个hello.py文件(C:\Users\Desktop\py),写入以下代码:
"""这是自己编写自定义模块模块的功能是: 学习自定义模块使用 其中: data 是一个变量 list 是一个列表 func 是一个函数""" #!/usr/bin/python3 data=1234 list=['1','2','3','4','5','6'] def func(): print("我是自定义模块") #以下是测试代码 if __name__=='__main__': #只有当 __name__ =='__main__' 时才调用测试函数 print("data=",data) print("list=",list) func() #调用函数 #本模块被执行时, __name__才等于__main__ #当该模块被其他模块引用时,__name__的值就是模块名,所以其他模块引用该模块时 #不会执行测试代码 |
在其他任意目录下(C:\Users\Desktop\test),再创建一个python_code.py文件,不需要和hello.py文件目录相同。
#!/usr/bin/python3 import hello #导入hello模块 #打印模块的帮助信息 print(hello.__doc__) #调用模块里的成员 #print(hello.data) #print(hello.list) #hello.func() |
由于python_code.py文件和hello.py文件不在相同目录下,如果直接在python_code.py文件中导入hello模块会报错,因为Python解释器找不到hello.py模块的位置。
想要让Python解释器找到hello.py模块,可以把模块文件的存储位置,临时添加到 sys.path 变量中。示例代码:python_code.py
#!/usr/bin/python3 import sys #在添加完整路径中,路径中的 '\' 需要使用 \ 进行转义,否则会导致语法错误。 sys.path.append('C:\\Users\\Desktop\\py') #导入hello模块 import hello #调用模块里的成员 print(hello.data) print(hello.list) |
这样运行就不会出错。
程序成功运行后,顺便在python_code.py 文件增加一行代码,输出 sys.path 变量的值,查看路径是否已经添加成功:示例代码: python_code.py
#!/usr/bin/python3 import sys #在添加完整路径中,路径中的 '\' 需要使用 \ 进行转义,否则会导致语法错误。 sys.path.append('C:\\Users\\Desktop\\py') #导入hello模块 import hello #调用模块里的成员 print(hello.data) print(hello.list) print(sys.path) #打印搜索路径 |
可以看到输出的结果list中含有:' C:\\Users\\Desktop\\py '
通过该方法添加的目录,只能在执行当前文件的窗口中有效,窗口关闭后就会失效。
4.3 设置模块搜索路径: 将模块保存到指定位置
Python 程序默认的模块加载路径保存在 sys.path 变量中,我们可以先看看 sys.path 中保存的默认加载路径, 可以直接将编写好的 hello.py 文件添加到输出的任意一个默认路径下,就相当于为 Python 扩展了一个 hello 模块,这样任何 Python 程序都可使用该模块。
但通常来说,Python 的扩展模块都默认添加在 lib\site-packages 路径下,它专门用于存放 Python 的扩展模块和包。
将hello.py文件移动到lib\site-packages 路径下(以win10系统为例)。
移动成功之后,运行python_code.py文件加载hello模块,测试结果。
4.4 设置模块搜索路径: 环境变量
Python 将会根据 PYTHONPATH 环境变量的值来确定到哪里去加载模块。PYTHONPATH 环境变量的值是多个路径的集合,这样 Python 就会依次搜索 PYTHONPATH 环境变量所指定的多个路径,试图从中找到程序想要加载的模块。
5. Python的包
5.1 包的概念介绍
实际开发中,一个大型的项目往往需要使用成百上千的 Python 模块,如果将这些模块都堆放在一起,势必不好管理;使用模块可以有效避免变量名或函数名重名引发的冲突,但是如果模块名重复怎么办呢?因此,Python提出了包(Package)的概念。
在Python语言中,一个.py文件就可以叫做一个模块(model),如果a.py中有一个功能在b.py中被引用,那么a.py就算是一个模块;包是作为目录存在的,包的一个特点就是文件中有一个__init__.py文件,包可以包含模块,也可以包含包。
简单理解,包就是文件夹,只不过在该文件夹下必须存在一个名为“__init__.py” 的文件。(这是 Python 2.x 的规定,在 Python 3.x 中,__init__.py 对包来说,并不是必须的)
每个包的目录下都必须建立一个 __init__.py 的模块,可以是一个空模块,可以写一些初始化代码,其作用就是告诉 Python 要将该目录当成包来处理。
__init__.py 不同于其他模块文件,此模块的模块名不是 __init__,而是它所在的包名。
例如:在 python_code 包中的 __init__.py 文件,其模块名就是python_code 。
包是一个包含多个模块的文件夹,它的本质依然是模块,因此包中也可以包含包。
包是一种管理 Python 模块命名空间的形式,采用"点模块名称"。
比如: 一个模块的名称是 A.B, 那么他表示一个包 A中的子模块 B 。
就好像使用模块的时候,你不用担心不同模块之间的全局变量相互影响一样,采用点模块名称这种形式也不用担心不同库之间的模块重名的情况。在导入一个包的时候,Python 会根据 sys.path 中的目录来寻找这个包中包含的子目录。
5.2 创建包
创建一个包,主要分为如下两步:
(1)、创建一个文件夹,该文件夹的名字就是该包的包名。
(2)、在该文件夹内创建一个名为 __init__.py 的 Python 文件,在此文件中,可以不编写任何代码,也可以编写一些 Python 初始化代码,在此文件中编写的代码,其他程序文件导入包时,会自动执行。
示例: 创建一个名称为python_hello_pack的包
示例: __init__.py 文件代码
''' 这是学习包创建的一个例子 ''' print("这是自己创建的一个包") |
python_hello_pack包创建成功之后,在包的目录下创建模块,分别为:code_mode_1.py和code_mode_2.py
示例代码: code_mode_1.py
#!/usr/bin/python3 '''这是自定义模块1''' def func(): print("这是自定义模块1") if __name__ == "__main__": func() |
示例代码: code_mode_2.py
#!/usr/bin/python3 '''这是自定义模块2''' def func(): print("这是自定义模块2") if __name__ == "__main__": func() |
现在的包结构如下:
包中还有容纳其它的包,可以在python_hello_pack目录下继续添加其他的包和模块。
注意: 包的路径需要添加到Python的搜索路径中,才可以被其他Python程序加载,参考4.4小节。
这里选择第二种方式:
5.3 导入包
包的本质就是模块,因此导入包和导入模块的语法非常类似。无论导入自定义的包,还是导入从其他地方下载的第三方包,导入方法可归结为3 种。
说明: 用 [] 括起来的部分,是可选部分,即在使用时可以忽略。
与模块类似,包被导入之后,会在包目录下生成一个 __pycache__ 文件夹,并在该文件夹内为包生成一个 __init__.cpython-38.pyc 文件。
第一种: import 包名[.模块名 [as 别名]]
示例代码: 用前面创建好的python_hello_pack 包为例,导入包中的模块并使用模块中成员。
#!/usr/bin/python3 #导入包 import python_hello_pack.code_mode_1 import python_hello_pack.code_mode_2 python_hello_pack.code_mode_1.func() #调用模块中的函数 python_hello_pack.code_mode_2.func() #调用模块中的函数 |
结果:
这是自己创建的一个包 这是自定义模块1 这是自定义模块2 |
第二种: from 包名 import 模块名 [as 别名]
#!/usr/bin/python3 #从包中导出模块 from python_hello_pack import code_mode_1 from python_hello_pack import code_mode_2 code_mode_1.func() #调用模块中的函数 code_mode_2.func() #调用模块中的函数 |
第三种: from 包名.模块名 import 成员名 [as 别名]
#!/usr/bin/python3 #导入包 from python_hello_pack.code_mode_1 import func #从xxx包的xxx模块中导出xxx成员,并给它起一个别名 from python_hello_pack.code_mode_2 import func as func2 #调用模块中的函数 func() func2() #调用模块中的函数 |
结果:
这是自己创建的一个包 这是自定义模块1 这是自定义模块2 |
5.4 Python查看模块(变量、函数、类)方法
在导入模块之后,开发者往往需要了解模块包含哪些功能,比如包含哪些变量、哪些函数、哪些类等,还希望能查看模块中各成员的帮助信息,掌握这些信息才能正常地使用该模块。
Python内置的函数 dir() 可以找到模块内定义的所有名称。
语法: dir(模块名),以一个字符串列表的形式返回:
示例代码:
#!/usr/bin/python3 #导入包 import python_hello_pack.code_mode_1 import python_hello_pack.code_mode_2 #输出模块内包含的成员信息 print(dir(python_hello_pack.code_mode_1)) print(dir(python_hello_pack.code_mode_2)) |
结果:
这是自己创建的一个包 ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'func'] ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'func'] |
比如:其中的__file__属性可以输出模块的路径。
示例代码:
#!/usr/bin/python3 #导入包 import python_hello_pack.code_mode_1 import python_hello_pack.code_mode_2 print(python_hello_pack.code_mode_1.__file__) |
6. Python第三方库(模块)下载
进行 Python 程序开发时,除了使用 Python 内置的标准模块以及我们自定义的模块之外,还有很多第三方模块可以使用,这些第三方模块可以借助 Python官方提供的查找包页面(https://pypi.org/)找到。
使用第三方模块之前,需要先下载并安装该模块,然后就能像使用标准模块和自定义模块那样导入并使用。
下载和安装第三方模块,可以使用 Python 提供的 pip 命令实现。
pip 命令的语法格式如下:
pip install|uninstall|list 模块名 |
其中,install、uninstall、list 是常用的命令参数,各自的含义为:
(1) install:用于安装第三方模块,当 pip 使用 install 作为参数时,后面的模块名不能省略。
(2) uninstall:用于卸载已经安装的第三方模块,选择 uninstall 作为参数时,后面的模块名也不能省略。
(3) list:用于显示已经安装的第三方模块。
如果下载过程中提示升级pip工具,在命令行运行python -m pip install --upgrade pip 命令即可。
pip 命令会将下载完成的第三方模块,默认安装到 Python 安装目录中的 \Lib\site-packages 目录下,位于此目录的模块,可以直接使用 import 语句引入。
如果在运行python -m pip install --upgrade pip 命令下载速度慢,连接超时,可以使用参数-i指定国内下载源。
在命令行执行命令: python -m pip install --upgrade pip -i https://pypi.douban.com/simple
一些国内下载源的地址:
pip install -i https://pypi.douban.com/simple module # 豆瓣源 pip install -i http://mirrors.aliyun.com/pypi/simple/ module # 阿里云 pip install -i https://pypi.mirrors.ustc.edu.cn/simple/ module # 中国科技大学 pip install -i http://pypi.douban.com/simple/ module # 豆瓣(douban) pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ module # 清华大学 pip install -i http://pypi.mirrors.ustc.edu.cn/simple/ module # 中国科学技术大学 |