模块
模块的导入
在Python中可使用import关键字来导入某个模块。导入模块的方法有多种,下面对每种方法做简要介绍。
导入整个模块
使用import导入整个模块的基本格式如下:
import 模块名 [as 别名]
使用这种方式导入模块后,调用模块中的函数需要在函数名前加上模块名作为前缀,引用格式如下:
模块名.函数名
在调用模块中的函数时,之所以要加上模块名,是因为在多个模块中可能存在名称相同的函数,此时如果只通过函数名来进行调用,解释器将无法知道到底要调用哪个函数。
import math # 导入math模块
math.sqrt(4) # 求4的平方
结果为:2.0
当模块名字很长时,可以使用语句import 模块名 as 别名
为导入的模块设置别名,然后使用别名.函数名
的方式调用函数。例如:
>>>import random as r # 导入标准库random,并设置别名为r
>>>r.randint(1,100) # 获得[1,100]区间的随机整数
47
导入特定的函数
当我们只需要用到模块中的某个函数时,可只导入特定的函数。其基本格式如下:
from 模块名 import 函数名 [as 别名]
使用这种方式仅导入明确指定的函数,并且可以为导入的函数指定一个别名。这种导入方式可以减少查询次数,提高访问速度,同时也可以减少程序员需要输入的代码量。在调用函数时,不需要使用模块名作为前缀。
>>>from math import sqrt
>>>sqrt(9)
3.0
>>>from random import randint as r
>>>r(1,10)
10
导入模块中所有函数
使用星号*
可以导入模块中的所有内容(包括函数和变量等)。
其基本格式如下:
from 模块名 import *
这是‘导入特定的函数’用法的一种极端情况,可以一次导入模块中的所有内容。
例如:
>>>from math import *
>>>pi
3.141592653589793
>>>log2(8)
3.0
>>>sqrt(16)
4.0
这种方式写起来比较省事,可以直接使用模块中的函数而不需要再使用模块名作为前缀。
但一般并不推荐这样使用,因为这样做会降低代码的可读性,同时会导致命名空间的混乱。
模块的创建
在Python中,每个Python文件都可以作为一个模块,模块的名字就是文件名。
例如:现有一个文件test.py
,其中定义了求较小值的函数minmal(),代码如下所示:
def minmal(x,y):
if x>y:
return y
else:
return x
如果要调用上面的test文件,并计算两个数的最小值,可以这样写:
>>>import test # 导入test文件(模块)
>>>test.minmal(10,20)
10
__name__
属性
在实际开发过程中,开发人员为了让模块能够在项目中达到想要的效果,会自行在模块中添加测试信息。
例如,在test1.py
文件中添加测试代码如下:
def minmal(x,y):
if x>y:
return y
else:
return x
# 用来测试
r = minmal(2,3)
print('测试2和3的较小值为:',r)
此时如果在其他程序中导入此模块的话,测试代码会自动运行。
import test1
c = test1.minmal(5,6)
print('较小值为:',c)
运行结果为:
测试2和3的较小值为:2
较小值为:5
从上述结果可以看出,test1中的测试代码也运行了。但是这并不合理,测试代码只应在单独执行test1文件时执行,而不应被其他文件引用时执行。
为解决这个问题,Python模块提供了一个__name__
属性。通过__name__
属性可以识别程序的使用方式:每个Python模块在运行时都会有一个__name__
属性,当作为模块导入时,则其__name__
属性的值被自动设置为模块名;如果作为程序直接运行,则其__name__
属性被自动设置为字符串__main__
。
因此,如果想要实现在模块中被引用时,模块中的某程序块不运行,我们可以通过判断__name__
属性的值来实现。
例如,想要实现将test1.py
作为程序直接运行时,执行测试代码;而test1.py
作为模块导入时不执行测试代码,可将test1.py
文件中的代码做如下修改:
def minmal(x,y):
if x>y:
return y
else:
return x
# 用来测试
if __name__ == '__main__': # 识别当前的运行方式
r = minmal(2,3)
print('测试2和3的较小值为:',r)
再次运行下面代码时,可以看到test1中的测试代码没有运行:
>>>import test1
>>>c = test1.minmal(5,6)
>>>print('较小值为:',c)
较小值为:5
包
为了组织好模块,通常会将多个模块放在一个目录中。我么将Python模块所在目录称为包。且该目录下必须存在一个__init__.py
文件(文件内容可以为空)。例如,有如下包结构:
package_1
|—— __init__.py
|—— __module_1__.py
|—— __module_2__.py
|—— __module_3__.py
main.py
此时,如果main.py想要调用package_1包中模块module_1中的f()函数,可以使用下列语句实现:
import package_1.module_1 # 导入模块
package_1.module_1.f() # 调用函数
# 也可以用以下语句实现
from package_1 import module_1 # 导入模块
module_1.f() # 调用函数