一、模块的定义
Python模块(Module)是一个以“.py ”结尾的Python 文件,可以定义函数,类和变量。
模块的作用:快速的实现某种功能。
可以理解为:使用频率高的代码块封装在模块中,使用的时候导入模块即可调用,方便高效。
比如实现和时间相关的功能就可以使用time模块,我们可以认为一个模块就是一个工具包,每一个工具包中都有各种不同的工具供我们使用,进而实现各种不同的功能。
我们为什么要使用模块呢?
以我们经常调用的函数为例,我们在使用一个功能比较复杂的函数时,当我们仅仅调用它,可能只需要一行代码,但是定义这个函数的代码可能需要几百行甚至更多。按照每次都先定义后使用的方式,如果一个大项目的多个python文件都要用到这个函数,那这段函数的定义代码就要在多个python文件中出现,重复多次,不仅浪费空间而且效率低。
如果我们把这个函数定义在一个专门的模块中,每次使用的时候,导入模块调用,函数仅定义了一次,不仅节省空间,而且每次使用时导入模块调用即可,不必再去定义,可以提高效率。
二、模块的导入方式
模块在使用前需要先导入,导入的语法如下:
[ from 模块名 ] import [ 模块 | 类 | 变量 | 函数 | *] [as 别名 ]
常用的组合形式如:
import 模块名 from 模块名 import 类、变量、方法等 from 模块名 import * import 模块名 as 别名 from 模块名 import 功能名 as 别名
2.1 import模块名
语法:
import 模块名 #导入一个模块
import 模块名1,模块名2 #导入多个模块,用逗号隔开
模块名.功能名() #使用模块内的功能时用 “ . ”访问
我们在学习文件的时候,为了方便观察,使用了sleep函数,下面让我们看一下如何导入time模块,调用sleep函数:
import time #导入python内置模块time(time.py文件)
print('5秒之后输出:Hello World')
time.sleep(5) #通过.访问模块内的函数
print('Hello World')
运行后:
2.2 from 模块名 import 功能名
语法:
from 模块名 import 功能名 #导入模块内的某个功能
功能名( ) #使用模块内的功能时无须其他,直接使用功能名即可
代码示例:
from time import sleep #导入python内置模块time中的sleep方法
print('5秒之后输出:Hello World')
sleep(5) #直接使用函数名
print('Hello World')
运行后:
2.3 from 模块名 import *
语法:
from 模块名 import * #导入模块内的所以功能
功能名( ) #使用模块内的功能时无须其他,直接使用功能名即可
代码示例:
from time import * #导入python内置模块time中的所有方法
print('5秒之后输出:Hello World')
sleep(5) #直接使用函数名
print('Hello World')
运行后:
2.4 as定义别名
当我们导入的模块名、功能名太长,使用不方便时,可以另定义为的新名称,以便后续使用。
语法:
# 模块定义别名
import 模块名 as 别名
# 功能定义别名
from 模块名 import 功能 as 别名
模块定义别名 ,代码示例:
import time as t #导入python内置模块time并改名为t
print('5秒之后输出:Hello World')
t.sleep(5) #通过.访问模块内的函数
print('Hello World')
运行后:
功能定义别名, 代码示例:
from time import sleep as s #导入python内置模块time中的sleep方法并改名为s
print('5秒之后输出:Hello World')
s(5) #直接使用函数名
print('Hello World')
运行后:
三、自定义模块
除了python中已经写好的模块,有时候我们也需要自己写模块以供使用,即自定义模块。
注意:自定义模块名必须要符合标识符命名规则。
例如我们要写一个定义加法的模块,创立一个新文件add.py,在其中定义一个加法函数。
在test1.py中导入自定义模块add,使用my_test函数,代码示例:
import add
ret=add.my_test(2,3)
print(ret)
输出:
5
3.1 __main__
一般我们在自定义模块时,经常会在模块内测试一下功能,确保功能可以正常使用。但是在另一个文件中调用的时候,模块中的测试也会跟随输出,因为模块再被导入的时候,实际上模块内的代码也被执行了,那如何解决这个问题呢?
我们可以通过文件中的内置变量__name__来解决,将 '__main__'赋给变量__name__,在模块内if判断的结果就为True,在导入了该模块的其他文件中if判断的结果就为False(因为其他文件中的内置变量__name__的值不是 '__main__'),用于功能测试的代码语句就能得以控制。
add.py :
def my_test(x,y):print (x+y)# 只在当前文件中调用该函数,其他导入的文件内不符合该条件,则不执行test函数调用
if __name__ == '__main__':#点击右键运行后, '__main__'被赋给变量__name__my_test(2, 3)
test1.py :
import add
add.my_test(2,3)
运行test1.py后输出 :
5
3.2 __all__
如果模块文件中有'__all__'变量,当使用 ' from 模块名 import * ' 导入时,只能导入这个列表中的元素。
moudle1.py:
__all__=['add','sub']def add(x,y):print(x+y)def sub(x,y):print(x-y)def mul(x,y):print(x*y)def div(x,y):print(x/y)
test1.py :
from moudle1 import*
add(1,5)
sub(6,2)
mul(4,2)
moudle1.py的列表中只有add和sub,在test1.py中是无法使用mul的,运行test1.py后:
3.3 不同模块的同名功能
当导入多个不同的模块,且不同模块内有同名功能时,如果调用这个同名功能,调用到的是后面导入的模块的功能。
在模块moudle1.py中定义函数func,在模块moudle2.py中定义同名函数func,文件test1.py导入这两个模块的同名函数后,调用到的是后面导入的模块的函数,示例如下:
moudle1.py:
def func():print('灰太狼')
moudle2.py:
def func():print('喜羊羊')
test1.py :
from moudle1 import func
from moudle2 import func
func()
运行test1.py后输出:
喜羊羊