二、python编程进阶02:模块和包

目录

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  # 中国科学技术大学

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值