一、模块的定义
简单的来说,模块就是每个以.py为后缀的Python文件,可以通过在一个Python文件中导入其它Python文件,从而使用该模块中的类、函数、变量等等,模块可分为内置模块、第三方模块以及自定义模块。
每一个python文件都可作为一个模块存在,文件名即为模块名,在程序开发中,会将耦合度较低的多个功能写入不同的文件中,制作成模块,并在其它文件中以导入模块的方式使用自定义模块中的内容。
二、导入模块、调用模块
(一)import语句
通过import语句可以一次导入一个或多个模块,多个模块中各模块使用逗号隔开,如下:
import 模块 import 模块1,模块2,…,模块n
另外可通过.来使用导入的模块中的类或函数,即模块名称.类名称/函数名称()的形式。
若模块名称较长,还可通过as对模块起别名,在调用时即可通过别名来调用模块中的内容,即import 模块名称 as 别名。
下列python代码,这是一个名为module.py的文件,作为模块:
def input_number(): print("HELLO WORLD!") print("该模块被调用!")
下列python代码,这是一个名为123.py的文件,在该文件中引用module.py模块文件中的input_number()函数,即module.input_number():
import module module.input_number()
运行结果如下:
(二)from…import语句
from…import…语句的格式如下:
from 模块名称 import 变量名称/类名称/函数名称
和import语句一样,可一次导入多个类、变量或函数,中间使用逗号隔开。另外还可以通过from … import *导入模块中的全部内容。
三、标准模块库
python中自带一些标准模块库,比如sys模块、os模块、random模块以及time模块等等,以下简单地介绍这几种标准模块库。
(一)sys模块
sys模块用于python运行时的环境操作,比如
sys.agrv获取命令行参数列表,列表中第一个元素是该程序本身所在路径;
sys.path用于获取模块的搜索路径;
sys.exit()函数用于退出当前程序,其后的代码不再执行,正常退出返回值为0。
下列python代码,通过import sys引用sys模块:
import sys print(sys.argv) print(sys.path) print("退出程序:") sys.exit()
运行结果如下:
(二)os模块
os模块提供访问操作系统(OS)服务的功能,比如os.getcwd()
函数用于获取当前脚本的工作路径;os.chdir()
函数用于改变当前脚本的工作路径;os.remove()
用于删除指定文件;
os._exit()用于终止python程序,与sys.exit()不同,sys.exit()在执行后会引发一个SystemExit异常,若捕获该异常则仍然会执行sys.exit()之后的代码。
下列python代码,通过import os引用os模块:
import os print(os.getcwdb())
运行结果如下:
(三)random模块
random模块用于产生随机数,比如
random.random()用于返回(0,1]之间的随机实数;
random.randint(x,y)用于返回[x,y]之间的随机整数;
random.uniform(x,y)用于返回[x,y]之间的随机浮点数;
random.choice(seq)用于从序列seq中随机返回一个元素。
下列python代码,通过import random引用random模块:
import random print(random.random()) print(random.randint(1, 10)) print(random.uniform(1, 10)) number = [1, 0, 10, -10, 3] print(random.choice(number))
运行结果如下:
(四)time模块
time模块提供一系列关于时间处理的函数,比如
1、time.time()用于获取当前时间,可通过该函数计算程序的执行时间。
下列python代码,这里计算10000!,即10000的阶乘,通过time()函数计算计算10000的阶乘所耗费的时间:
import time begin = time.time() print(begin) i = 1 result = 1 while i <= 10000: result = result * i i = i + 1 end = time.time() print(end) spend_time = end - begin print(f"程序执行时间为:{spend_time}")
运行结果如下:
2、time.sleep(secs)函数使程序进入休眠态,休眠时间由secs参数决定,单位为秒,通过该函数可使程序中某个功能代码设置休眠时间,即设置一段时间间隔后执行;
下列python代码,通过random和time模块库,使用random.choice()函数随机选择列表中的一个元素,使用time.sleep(2)表示每隔2秒执行一次循环,另外remove() 函数用于移除列表中某个值的第一个匹配项:
import random, time class_name = ["1班", "2班", "3班", "4班"] for i in range(len(class_name)): if len(class_name) != 0: name = random.choice(class_name) print(f"本次随机选择的班级是:{name}") class_name.remove(name) print(f"被选择的{name}已被移除,2s后将进行下一次随机选择!") time.sleep(2) print("已随机选择完成!")
运行结果如下:
3、time.strptime()
函数用于将一个时间格式的字符串解析为时间元组,而time.mktime()
函数用于将时间元组转换为秒数,通过这两个模块函数即可自定义时间戳。
下列python代码,time…strptime()
函数将2021-11-10 22:21:41转换为时间元组,time.mktime()
函数将时间元组转换为时间戳:
import time str_time = "2021-11-10 22:21:41" time_struct = time.strptime(str_time, "%Y-%m-%d %H:%M:%S") print(time_struct) timestamp = time.mktime(time_struct) print(timestamp)
运行结果如下:
四、模块导入特性
(一)__all__属性
通过在python模块的开头定义一个__all__属性,可以说这个属性是一个列表,其中包含的元素规定了在通过使用from…import*语句导入模块时所包含的模块内内容。
下列python代码,module.py模块中设置了__all__属性,即规定导入该模块时只能使用out_number和out_page两个函数:
#module.py模块 __all__ = ["out_number", "out_page"] def out_word(): print("HELLO WORLD!") def out_number(): a = input("请输入一个数字:") print(f"输入的数字为{a}") def out_page(x, y): return x * y
下列python文件test.py中导入module模块:
#test.py from module import * print(out_page(2, 0)) out_number() out_word()
这里使用了out_word()
,所以程序会报错,显示未定义:
正确的运行结果如下,去掉out_word()
,因为module.py模块中__all__属性中只允许使用out_number和out_page两个函数:
(二)__name__属性
__name__属性用于在导入一个模块时,使该模块中的某一程序块不执行,通常该属性与if-else语句共同使用,若当前模块是启动模块,即非测试时,设定其值为__name__=="__main__"。
__name__属性用于在项目开发整合前避免项目运行时执行测试代码。
下列python代码,使用if-else条件语句:
#module.py模块 def out_word(): print("HELLO WORLD!") def out_number(): a = input("请输入一个数字:") print(f"输入的数字为{a}") def out_page(x, y): return x * y if __name__ == "__main__": out_word() print(out_page(2, 0)) out_number() else: print("另一模块")
运行结果如下:
在另一个模块,即test.py中导入该模块:
#test.py模块 from module import * out_word() print(out_page(2, 0)) out_number()
运行结果如下,可看到“另一模块”:
五、dir() 模块查找函数
dir()函数是一个内置函数,可以通过它查找到模块内所有定义的名称,并且以字符串列表的形式返回。
#module.py模块 __all__ = ["out_number", "out_page"] def out_word(): print("HELLO WORLD!") def out_number(): a = input("请输入一个数字:") print(f"输入的数字为{a}") def out_page(x, y): return x * y
查找module模块中所有定义的名称,可分为有参和无参,无参时则会返回所有定义的名称:
#test.py import module print(dir()) print(dir(module))
运行结果如下:
六、包
(一)包的定义
为了更好理清python代码,根据不同类别将模块归类划分,并将功能相近的模块放在同一个目录下,使其层次化,从而形成了包,包是一个包含__init__.py文件的目录,且该文件必须存在但可以为空,另外目录下还有子包以及一些模块。
包的存在可在一定程度上避免合作开发中模块重名的问题,包中的init文件作用是标识当前目录是一个python包以及模糊导入,即当该文件中没有声明__all__属性时,则使用from…import*导入的内容为空。
(二)包的创建
这里只介绍PyCharm中如何创建一个包的步骤,版本为 Community Edition 2021.2.1。
1、点击左上角的新建:
或在项目中右键新建:
2、选择python软件包(python package),点击设置文件名称。
3、可在项目栏看到创建的package1软件包。
可以展开看到有个默认的__init__.py文件:
(三)包的导入
包的导入与模块的导入一样,使用import语句以及from…import语句,但在导入包中的模块时,使用时需要在模块名称前加上包的名称,即包的名称.模块名称,若是使用已导入模块中的函数则通过包的名称.模块名称.函数名称实现。
下列python代码,创建package1软件包,其中包括__init__.py文件、module1.py和module2.py文件:
#__init__.py 1 #module1.py def out_word(): print("HELLO WORLD!")
#module2.py def out_number(): a = input("请输入一个数字:") print(f"输入的数字为{a}") def out_page(x, y): return x * y
项目栏中:
使用另一个模块test.py导入该包,且通过import语句导入该包:
#test.py import package1.module1 import package1.module2 package1.module1.out_word() package1.module2.out_number() print(package1.module2.out_page(2, 3))
运行结果如下: