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

Posted 晚风(●•σ )

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()

运行结果如下:

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

运行结果如下:

以上是关于Python程序开发——第七章 模块与包的主要内容,如果未能解决你的问题,请参考以下文章

python---模块与包

Python---模块与包

Python模块与包

Python模块与包

Python的模块与包如何使用?

python模块与包的调用