Python工程的结构
文章图片
模块
1.什么是模块 ? 模块(Module)是一个扩展名为.py的Python文件,这个文件中包含许多功能函数或类,多个模块可以通过包组织。通过在当前.py文件中导入其他.py文件,可以使用被导入文件中定义的内容,如类、变量、函数等。
? Python中的模块可以分为三类,分别是内置模块、第三方模块和自定义模块:
- **内置模块:**Python内置标准库中的木块,也是Python的官方模块,可以直接导入程序供开发人员使用;
- **第三方模块:**由非官方制作发布、供大众使用的Python模块,在使用之前需要开发人员先自行安装;
- **自定义模块:**开发人员在程序编写过程中自行编写的、存放功能性代码的.py文件。
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分隔为(目录,文件名)的二元组并返回 |
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()
文章图片
5.模块变量 ? 依据模块的导入特性,将这些特性用模块的变量来表示,常用变量有:
- all变量:定义可以导出的成员,仅对from xx import *有效;
- **__doc__变量:**文档字符串;
- **file*模块对应的文件路径名;
- **__name__变量:**模块自身名字,可以判断是否为主模块,当此模块作为主模块(第一个运行的模块)运行时,name__绑定__main,不是主模块,而是被其他模块导入时,存储模块名;
- **_*当模块中的内容以单下划线定义时,表示为该模块的隐藏内容。
定义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中的包 1.包结构 ? 为了更好的组织Python代码,开发人员通常会根据不同的业务将模块进行分类,并将功能相近的模块划分到同一目录下,如果要想导入这个模块,就得先导入这个模块的包。Python中的包是一个包含__init__.py文件的目录,该目录下还包含一些模块和子包。一个包的结构大致如下:
文章图片
? 其中__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.练习 ? 在如下结构中自定义方法,完成如下调用:
- 在main.py中调用skill_deployer.py;
- 在skill_deployer.py中调用skill_manager.py
- 在skill_manager中调用double_list_helper.py
- 在list_helper.py中调用main.py。
文章图片
【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)
推荐阅读
- it|算法工程师老潘总结的一些经验
- Python学习|自学Python 33 装饰器(拓展函数功能)
- 问题|P7 Day3 ---- 状态保持, 异常处理与请求钩子
- Python|【leetcode】203. 移除链表元素(python)
- ios快捷指令|ios快捷指令 python_苹果有「快捷指令」,Windows下也有一键「快捷菜单」
- 使用 Python Poetry 进行依赖管理
- python|Python数据科学手册
- java|基于SSM的Java图书管理系统
- java|Spring Boot在线教育系统