模块

模块的导入

在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()		# 调用函数
posted @ 2021-11-04 16:26  Cara_Smith  阅读(85)  评论(0编辑  收藏  举报