python|Python模块和包的管理

Python工程的结构
python|Python模块和包的管理
文章图片

模块 1.什么是模块 ? 模块(Module)是一个扩展名为.py的Python文件,这个文件中包含许多功能函数或类,多个模块可以通过包组织。通过在当前.py文件中导入其他.py文件,可以使用被导入文件中定义的内容,如类、变量、函数等。
? Python中的模块可以分为三类,分别是内置模块、第三方模块和自定义模块:

  • **内置模块:**Python内置标准库中的木块,也是Python的官方模块,可以直接导入程序供开发人员使用;
  • **第三方模块:**由非官方制作发布、供大众使用的Python模块,在使用之前需要开发人员先自行安装;
  • **自定义模块:**开发人员在程序编写过程中自行编写的、存放功能性代码的.py文件。
2.模块的导入方式 ? Python的模块导入分为import和from…import…导入两种:
2.1.import导入
? 使用import导入模块的格式如下:
import 模块1,模块2....

? import支持一次导入多个模块,每个模块用逗号隔开:
import time#导入时间一个模块 import random, pygame#导入两个模块

? 导入模块后便可以使用"."来使用模块中的函数或类,语法格式为:
模块名.函数名()/类名

time.sleep(1)

? 如果在开发过程中,需要导入一些名称较长的模块,可使用as为这些模块起别名,语法格式为:
import 模块名 as 别名

2.2.from…import…导入
? 使用from…import…导入模块后,无需添加前缀,可以像使用当前程序中的内容一样使用模块中的内容,语法格式为:
from 模块名 import 函数/类/变量

? 这种导入方式也支持一次导入多个函数、类或变量,多个函数、类或变量之间用逗号隔开。
from time import sleep, time

? 当然也可以使用通配符来表示导入模块中的全部内容:
from 模块名 import *

? 同时还可以支持为模块或模块中的函数起别名:
from 模块名 import 函数名 as 别名

from time import sleep as s1 s1(1)#s1为函数sleep()的别名

3.常见的标准模块 ? Python中内置了许多标准模块,例如sys,os,random和time模块等。
3.1.sys模块
? sys模块中提供了一系列与Python解释器交互的函数和变量,用于操控Python的运行环境。常见的变量和函数如下所示:
变量/函数 说明
sys.argv 获取命令行参数列表,第一个元素为程序自身的路径
sys.version 获取Python解释器的版本信息
sys.path 获取模块的搜索路径,该变量的初始值为环境变量PYTHONPATH的值
sys.platfrom 返回操作系统平台的名称
sys.exit() 退出当前程序,可为该函数传递参数,以设置返回值或退出信息,正常退出的返回值为0
import sysprint(sys.argv)# ['D:/笔记/Python/SC2003/project/2048/demo01.py'] print(sys.version)# 3.10.1 print(sys.path) print(sys.platform)# win32 sys.exit("退出程序") print(sys.argv)

3.2.os模块
? os模块中提供了访问操作系统服务的功能,该模块常用函数如下所示:
函数 说明
os.getcwd() 获取当前工作路径,即当前Python脚本所在的路径
os.chdir() 改变当前脚本的工作路径
os.remove() 删除指定文件
os.exit() 终止Python程序
os.path.abspath(path) 返回path规范化的绝对路径
os.path.split(path) 将path分隔为(目录,文件名)的二元组并返回
? os中的exit()与sys模块的exit()有所不同,执行os模块中的exit()后,程序会立即结束,之后的代码不会再执行;而执行sys模块中的exit()函数会引发一个SystemExit异常,如没有捕获该异常,后面的代码不会再执行,若捕获了则后续的代码仍然会执行。
import osprint(os.getcwd())# D:\笔记\Python\SC2003\project\2048 print("执行exit()之前。。。") try: os.exit(0) print("执行exit()之后。。。") except: print("结束程序")

3.3.random模块
? random模块为随机模块,该模块中定义了多个可产生各种随机数的函数。random模块中的常用函数如下所示:
函数 说明
random.random() 返回(0,1]之间的随机实数
random.randint(x, y) 返回[x, y]之间的随机整数
random.choice(seq) 从序列seq中随机返回一个元素
random.uniform(x, y) 返回[x,y]之间随机的浮点数
import random print(random.randint(1, 100)) print(random.uniform(1, 100)) name = ["李刚", "李渊", "李世民", "李隆基", "李自成"] print(random.choice(name))

3.4.time模块
? time模块提供了一系列处理时间的函数,常用的函数说下所示:
函数 说明
time.time() 获取当前时间,单位为秒
time.sleep(secs) 进入休眠状态,时长由参数secs指定,单位为秒
time.strptime(string[,format]) 将一个时间格式(如2022-03-01)的字符串解析为时间元组
time.localtime(secs) 以struct_time类型输出本地时间
time.asctime([tuple]) 获取时间字符串,或将时间元组转换为字符串
time.mktime(tuple) 将时间元组转换成秒数
strftime(format[,tuple]) 返回字符串表示的当地时间,格式由format决定
import timebefore = time.time() for i in range(10000): print("Hello World!") after = time.time() interval = after - before print(f"输出10遍Hello World的运行时间为{interval}秒")

import random import timelist1 = ["李刚", "李渊", "李世民", "李隆基", "李自成"] list2 = [] for i in range(len(list1)): people = random.choice(list1) list1.remove(people) list2.append(people) time.sleep(2)# 每隔2秒执行一次 print(f"此时list2的成员有{list2}")

str_dt = "2022-03-01 12:59:59" # 转换成数组 time_struct = time.strptime(str_dt, '%Y-%m-%d %H:%M:%S') # 转换成时间戳 timestamp = time.mktime(time_struct) print(time_struct) print(timestamp)

4.自定义模块 ? 一般在进行程序开发时,不会将所有的代码放到一个文件中,而是将耦合度较低的多个功能写入不同的文件中,制作成模块,并在其他文件中以导入模块的方式使用自定义模块中的内容。
? Python中的每个文件都可以作为一个模块存在,文件名即为模块名。创建一个名为module01的Python文件,内容如下:
print("模块1。。。")def fun01(): print("模块1的fun01()函数")class MyClass01: def fun02(self): print("MyClass01.fun02()")

? module01文件即可视为一个模块,该模块中定义的类、函数、变量都可以在导入该模块的程序中使用,创建demo01使用module01中的资源,在导入前需要在它们上层同一目录下右键选择Mark Directory as–Source Root,使它们能在同一资源目录下:
import demo01 demo01.fun01() mClass01 = demo01.MyClass01() mClass01.fun02()

python|Python模块和包的管理
文章图片

5.模块变量 ? 依据模块的导入特性,将这些特性用模块的变量来表示,常用变量有:
  • all变量:定义可以导出的成员,仅对from xx import *有效;
  • **__doc__变量:**文档字符串;
  • **file*模块对应的文件路径名;
  • **__name__变量:**模块自身名字,可以判断是否为主模块,当此模块作为主模块(第一个运行的模块)运行时,name__绑定__main,不是主模块,而是被其他模块导入时,存储模块名;
  • **_*当模块中的内容以单下划线定义时,表示为该模块的隐藏内容。
较大型项目中,一个项目通常由多名开发人员共同开发,为保证各模块整合后的正常运行,Python中提供了__name__属性,它与if条件语句配合使用,若当前模块是启动模块,则其__name__的值为__main__,若该模块被其他模块导入,则__name__的值为文件名。
定义demo03,内容如下:
# 定义当前模块哪些成员可以被导入 __all__ = ["fun01", "_fun02", "MyClass"] print("模块3.。。") def fun01(): print("模块3中的fun01()...") # 只在模块内部使用的成员可以用_开头 def _fun02(): print("模块3中的fun02()...") class MyClass: @staticmethod def fun03(): print("MyClass的fun03()...")

定义demo04调用demo03中的内容:
from demo03 import * from demo03 import _fun02 fun01() # 隐藏成员不能通过from 模块 import *导入 # _fun02() # 可以通过from demo03 import _fun02形式调用 _fun02() MyClass.fun03()# 打印注释等文档字符串,可以通过该属性查看文档 print(__doc__) # 打印当前模块的绝对路径 print(__file__) print(__name__)

?
python|Python模块和包的管理
文章图片

Python中的包 1.包结构 ? 为了更好的组织Python代码,开发人员通常会根据不同的业务将模块进行分类,并将功能相近的模块划分到同一目录下,如果要想导入这个模块,就得先导入这个模块的包。Python中的包是一个包含__init__.py文件的目录,该目录下还包含一些模块和子包。一个包的结构大致如下:
python|Python模块和包的管理
文章图片

? 其中__init__.py的作用有两个,第一个是标识当前目录是一个Python包;第二便是模糊导入。如果__init__.py文件中没有声明__all__属性,那么使用"from…import…"导入的内容为空。
2.包的导入 ? 包的导入和模块的导入大致相同,也是通过import或from…import…来实现。
在当前工程下新增package,取名Package01,并在包中创建模块mudule_a.py,并定义函数:
def fun01(): print("1包中的fun01()")

再在package01包下创建package02,并创建模块module_b.py,调用mudule_a.py中的函数fun01():
def fun02(): print("2包中的fun02()")

在当前的根目录下创建demo.py和package01同一级,完成package01和package02下模块函数的调用:
# from 包.模块 import 成员 from package01.module_a import fun01 fun01()from package01.package02.module_b import fun02 fun02()

3.练习 ? 在如下结构中自定义方法,完成如下调用:
  1. 在main.py中调用skill_deployer.py;
  2. 在skill_deployer.py中调用skill_manager.py
  3. 在skill_manager中调用double_list_helper.py
  4. 在list_helper.py中调用main.py。
python|Python模块和包的管理
文章图片

【python|Python模块和包的管理】生成6位随机验证码:
""" 验证码""" """ 随机生成6位的验证码(字母数字随机组合,包含大小写) chr()函数返回值是当前整数对应的ascii字符。 """ import randomdef verifycode(): code_list = '' # 每一位验证码都有三种可能(大写字母,小写字母,数字) for i in range(6):# 控制验证码生成的位数 state = random.randint(1, 3) if state == 1: # ASCII编码集中大写字母A-Z对应65-90位 first_kind = random.randint(65, 90)# 大写字母 random_uppercase = chr(first_kind) code_list = code_list + random_uppercaseelif state == 2: # ASCII编码集中小写字母a-z对应97-122位 second_kinds = random.randint(97, 122)# 小写字母 random_lowercase = chr(second_kinds) code_list = code_list + random_lowercase elif state == 3: third_kinds = random.randint(0, 9) code_list = code_list + str(third_kinds) return code_listif __name__ == '__main__': verifycode = verifycode() print(verifycode)

    推荐阅读