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

相关文章
|
27天前
|
开发者 Python
如何在Python中管理模块和包的依赖关系?
在实际开发中,通常会结合多种方法来管理模块和包的依赖关系,以确保项目的顺利进行和可维护性。同时,要及时更新和解决依赖冲突等问题,以保证代码的稳定性和可靠性
44 4
|
7天前
|
Python
Python Internet 模块
Python Internet 模块。
102 74
|
25天前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
104 63
|
26天前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。
|
26天前
|
持续交付 Python
如何在Python中自动解决模块和包的依赖冲突?
完全自动解决所有依赖冲突可能并不总是可行,特别是在复杂的项目中。有时候仍然需要人工干预和判断。自动解决的方法主要是提供辅助和便捷,但不能完全替代人工的分析和决策😉。
|
19天前
|
Python 容器
[oeasy]python048_用变量赋值_连等赋值_解包赋值_unpack_assignment _
本文介绍了Python中变量赋值的不同方式,包括使用字面量和另一个变量进行赋值。通过`id()`函数展示了变量在内存中的唯一地址,并探讨了变量、模块、函数及类类型的地址特性。文章还讲解了连等赋值和解包赋值的概念,以及如何查看已声明的变量。最后总结了所有对象(如变量、模块、函数、类)都有其类型且在内存中有唯一的引用地址,构成了Python系统的基石。
27 5
|
27天前
|
Python
Python的模块和包
总之,模块和包是 Python 编程中非常重要的概念,掌握它们可以帮助我们更好地组织和管理代码,提高开发效率和代码质量
38 5
|
26天前
|
数据可视化 Python
如何在Python中解决模块和包的依赖冲突?
解决模块和包的依赖冲突需要综合运用多种方法,并且需要团队成员的共同努力和协作。通过合理的管理和解决冲突,可以提高项目的稳定性和可扩展性
|
1月前
|
JavaScript 前端开发 Python
python中的OS模块的基本使用
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。博客分享前端技术及全栈开发经验,持续更新中,期待您的关注和支持!🎉🎉🎉
35 0
|
1月前
|
JavaScript 前端开发 Python
python中的platform模块的基本使用
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。博客分享前端技术,助你成长。关注我,持续更新中!🎉🎉🎉
23 0