Python程序开发——第七章 模块与包

简介: Python程序开发——第七章 模块与包

一、模块的定义


简单的来说,模块就是每个以.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()

运行结果如下:

1667109744919.jpg


(二)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()


运行结果如下:

1667109792124.jpg


(二)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())

运行结果如下:

1667109831850.jpg


(三)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))


运行结果如下:

1667109853190.jpg


(四)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}")

运行结果如下:

1667109881583.jpg


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("已随机选择完成!")

运行结果如下:

1667109908105.jpg


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)

运行结果如下:

1667109945579.jpg


四、模块导入特性


(一)__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(),所以程序会报错,显示未定义:

1667109997643.jpg

正确的运行结果如下,去掉out_word() ,因为module.py模块中__all__属性中只允许使用out_number和out_page两个函数:

1667110006576.jpg


(二)__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("另一模块")

运行结果如下:

1667110037288.jpg


在另一个模块,即test.py中导入该模块:

#test.py模块
from module import *
out_word()
print(out_page(2, 0))
out_number()

运行结果如下,可看到“另一模块”:

1667110054332.jpg


五、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))

运行结果如下:

1667110093092.jpg


六、包


(一)包的定义


为了更好理清python代码,根据不同类别将模块归类划分,并将功能相近的模块放在同一个目录下,使其层次化,从而形成了包,包是一个包含__init__.py文件的目录,且该文件必须存在但可以为空,另外目录下还有子包以及一些模块。


包的存在可在一定程度上避免合作开发中模块重名的问题,包中的init文件作用是标识当前目录是一个python包以及模糊导入,即当该文件中没有声明__all__属性时,则使用from…import*导入的内容为空。


(二)包的创建


这里只介绍PyCharm中如何创建一个包的步骤,版本为 Community Edition 2021.2.1。

1、点击左上角的新建:

1667110109967.jpg

或在项目中右键新建:

1667110125946.jpg

2、选择python软件包(python package),点击设置文件名称。

1667110134659.jpg

3、可在项目栏看到创建的package1软件包。

1667110146304.jpg

可以展开看到有个默认的__init__.py文件:

1667110161743.jpg


(三)包的导入


包的导入与模块的导入一样,使用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

项目栏中:

1667110201390.jpg

使用另一个模块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))

运行结果如下:

1667110240520.jpg

相关文章
|
6天前
|
Python
在Python中,可以使用内置的`re`模块来处理正则表达式
在Python中,可以使用内置的`re`模块来处理正则表达式
19 5
|
16天前
|
Java 程序员 开发者
Python的gc模块
Python的gc模块
|
19天前
|
数据采集 Web App开发 JavaScript
python-selenium模块详解!!!
Selenium 是一个强大的自动化测试工具,支持 Python 调用浏览器进行网页抓取。本文介绍了 Selenium 的安装、基本使用、元素定位、高级操作等内容。主要内容包括:发送请求、加载网页、元素定位、处理 Cookie、无头浏览器设置、页面等待、窗口和 iframe 切换等。通过示例代码帮助读者快速掌握 Selenium 的核心功能。
62 5
|
23天前
|
Python
SciPy 教程 之 SciPy 模块列表 6
SciPy教程之常量模块介绍:涵盖公制、二进制(字节)、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率及力学单位。示例展示了角度单位转换为弧度的几个常用常量。
18 7
|
23天前
|
Python
SciPy 教程 之 SciPy 模块列表 7
`scipy.constants` 模块提供了常用的时间单位转换为秒数的功能。例如,`constants.hour` 返回 3600.0 秒,表示一小时的秒数。其他常用时间单位包括分钟、天、周、年和儒略年。
17 6
|
20天前
|
Python
SciPy 教程 之 SciPy 模块列表 13
SciPy教程之SciPy模块列表13:单位类型。常量模块包含多种单位,如公制、二进制(字节)、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例代码展示了如何使用`constants`模块获取零摄氏度对应的开尔文值(273.15)和华氏度与摄氏度的转换系数(0.5556)。
17 1
|
21天前
|
XML 前端开发 数据格式
超级详细的python中bs4模块详解
Beautiful Soup 是一个用于从网页中抓取数据的 Python 库,提供了简单易用的函数来处理导航、搜索和修改分析树。支持多种解析器,如 Python 标准库中的 HTML 解析器和更强大的 lxml 解析器。通过简单的代码即可实现复杂的数据抓取任务。本文介绍了 Beautiful Soup 的安装、基本使用、对象类型、文档树遍历和搜索方法,以及 CSS 选择器的使用。
52 1
|
22天前
|
Python
SciPy 教程 之 SciPy 模块列表 9
SciPy教程之常量模块介绍,涵盖多种单位类型,如公制、质量、角度、时间、长度、压强等。示例展示了如何使用`scipy.constants`模块查询不同压强单位对应的帕斯卡值,包括atm、bar、torr、mmHg和psi。
13 1
|
22天前
|
Python
SciPy 教程 之 SciPy 模块列表 8
SciPy教程之常量模块单位类型介绍。该模块包含多种单位,如公制、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例展示了部分长度单位的转换值,例如英寸、英尺、海里等。
14 1
|
24天前
|
知识图谱 Python
SciPy 教程 之 SciPy 模块列表 5
本教程介绍SciPy常量模块中的单位类型,涵盖公制、质量、时间、长度等单位。示例代码展示了如何使用`scipy.constants`模块获取不同质量单位的千克值,如公吨、磅、盎司、原子质量单位等。
15 1