Python进阶(6):模块Modules
模块Modules
在python中模块【Module】类似于C#的命名空间namespace,在python中,一个扩展名(后缀名)为.py的文件就成为一个模块。模块名是区分字母大小写的
导入模块import 类似于C#的using 命名空间名;
通常情况下,我们把能够实现某一特定功能的代码放置在一个文件中作为一个模块,从而方便其他程序和脚本导入并使用。另外,使用模块也可以避免函数名和变量名冲突。但是随着程序不断变大,为了便于维护,需要将其分为多个文件,这样可以提高代码的可维护性。另外,使用模块还可以提高代码的可重用性。即编写好一个模块后,只要是实现该功能的程序,都可以导入这个模块实现。
自定义模块
在 Python 中,自定义模块有两个作用,一个是规范代码,让代码更易于阅读,另一个是方便其他程序使用的已经编写好的代码,提高开发效率。自定义模块主要分为两部分,一部分是创建模块,另一部分是导入模块。
创建模块
创建模块可以将模块中相关的代码(变量定义和函数定义等)编写在一个单独的文件中,并且将该文件命名为【模块名.py】的形式。
创建模块时,设置的模块名不能是 Python 自带的标准模块名称。
模块文件的扩展名必须是.py。
使用import语句导入模块
创建模块后,就可以在其他程序中使用该模块了。使用模块需要先以模块的形式加载模块中的代码,这可以使用 import 语句实现。import 语句的基本语法格式如下:
import modulename [as alias]
其中modulename 为要导入模块的名称;
[as alias]为给模块起的别名,通过该别名也可以使用模块。
使用 import 语句还可以一次导入多个模块,在导入多个模块时,模块名之间使用逗号“,”进行分隔
使用 from...import 语句导入模块
在使用 import 语句导入模块时,每执行一条 import 语句都会创建一个新的命名空间(namespace)并且在该命名空间中执行与.py 文件相关的所有语句。在执行时,需在具体的变量、函数和类名前加上“模块名.”前缀。如果不想在每次导入模块时都创建一个新的命名空间,而是将具体的定义导入当前的命名空间中,这时可以使用 ftom..import 语句。使用 from..import 语句导入模块后,不需要再添加前缀,直接通过具体的变量、函数和类名等访问即可。
fom...import 语句的语法格式如下:
from modelname import member
参数说明如下:
modelmame:模块名称,区分字母大小写,需要和定义模块时设置的模块名称的大小写保持一致。
member:用于指定要导入的变量、函数或者类等。可以同时导入多个定义,各个定义之间使用逗号“,”分隔。如果想导入全部定义,也可以使用通配符星号“*”代替。
在导入模块时,如果使用通配符导入全部定义后,想查看具体导入了哪些定义,可以通过显示 dir()函数的值来查看。
Python中的包
使用模块可以避免函数名和变量名重名引发的冲突。那么,如果模块名重复应该怎么办呢?在Python 中,提出了包(Package)的概念。包是一个分层次的目录结构,它将一组功能相近的模块组织在一个目录下。这样,既可以起到规范代码的作用,又能避免模块名重名引起的冲突。
包简单理解就是“文件夹”,只不过在该文件夹下必须存在一个名称为“ __init__.py”的文件。
创建包
创建包实际上就是创建一个文件夹,并且在该文件夹中创建一个名称为“ __init__.py”的 Python 文件。在__init__.py 文件中,可以不编写任何代码,也可以编写一些Python 代码。__init__.py 文件中所编写的代码,在导入包时会自动执行。
__init__.py 文件是一个模块文件,模块名为对应的包名。例如,在 settings 包中创建的__init__.py
文件,对应的模块名为 settings。
使用包
创建包以后,就可以在包中创建相应的模块,然后再使用 import 语句从包中加载模块。从包中加载通常有以下3 种方式。
通过“import+ 完整包名 + 模块名”形式加载指定模块
“import+ 完整包名 + 模块名”形式是指:假如有一个名称为 settings 的包,在该包下有一个名称为 size 的模块,那么要导入 size 模块,可以使用下面的代码:
import settings.size
通过该方式导入模块后,在使用时需要使用完整的名称。
通过“from+ 完整包名 +import+ 模块名”形式加载指定模块
“from+ 完整包名 +import+ 模块名”形式是指:假如有一个名称为 setings 的包,在该包下有个名称为 size 的模块,那么要导入 size 模块,可以使用下面的代码。
from settings import size
通过该方式导入模块后,在使用时不需要带包前缀,但是需要带模块名。
通过“from+ 完整包名 + 模块名 +import+ 定义名”形式加载指定模块
“from + 完整包名 + 模块名 + import + 定义名”形式是指:假如有一个名称为 settings 的包,在该包下有一个名称为 size 的模块,那么要导入 size 模块中的 width 和 height变量,可以使用下面的代码。
from settings.size import width,height
通过该方式导入模块的函数、变量或类后,在使用时直接使用函数、变量或类名即可。
在每个模块的定义中都包括一个记录模块名称的变量__name__ ,程序可以检查该变量,以确定它们在哪个模块中执行。如果一个模块不是被导入其他程序中执行,那么它可能在解释器的顶级模块中执行。顶级模块的__name__变量的值为__main__
Python内置标准模块
导入示例
import random #导入标准模块 random
示例程序:
RectangleSnake.py
def girth(width, height):'''计算矩形的周长:param width: 宽度:param height: 高度:return:'''return (width + height) * 2
def area(width, height):'''计算矩形的面积:param width: 宽度:param height: 高度:return:'''return width * height
if __name__ == '__main__':print("矩形的周长为:",girth(40, 30))print("矩形的面积为:",area(40, 30))
CircleSnake.py
import math
def girth(radius):'''计算圆的周长:param radius: 半径:return:'''return 2*math.pi*radius
def area(radius):'''计算圆的面积:param radius: 半径:return:'''return math.pi*radius*radius
if __name__ == '__main__':print("圆的周长为:",girth(20))print("圆的面积为:",area(20))
CalculateSnake.py
import RectangleSnake as rect
import CircleSnake as circle
if __name__ == '__main__':width=30height=20print("矩形的周长为:",rect.girth(width, height))print("矩形的面积为:",rect.area(width, height))radius=10print("圆的周长为:",circle.girth(radius))print("圆的面积为:",circle.area(radius))