python第十八课--包的使用、软件开发规范、collections、time、os、sys模块介绍
昨日内容回顾
-
索引取值与迭代取值差异
可迭代对象 迭代器对象 生成器对象
-
模块简介
有了模块我们就可以站在巨人的肩膀上编程 模块的四种表现形式 模块的分类 自定义模块 内置模块 第三方模块
-
导入模块的两种句式
1.import import md 1.先产生执行文件名称空间 2.产生模块名称空间 执行模块文件代码 3.将模块文件代码执行过程中产生的名字放于模块名称空间中 4.在执行文件中通过模块名点的方式就可以随意的使用模块名称空间的名字 2.from...import... 1.先产生执行文件名称空间 2.产生模块名称空间 执行模块文件代码 3.将模块文件代码执行过程中产生的名字放于模块名称空间中 4.在执行文件中产生import后指定的名字 上述两种句式的差异 第一种不会轻易造成名字修改 md.name 第二种可能会轻易造成名字修改 name
-
导入模块的补充说明
1.起别名 import aaa as a from aaa import name as n 2.多个模块 import aaa,bbb,ccc import aaa import bbb import ccc 3.重复导入 只会导入一次
-
循环导入问题
1.名字在使用之前准备好即可 2.或者直接避免循环导入
-
判断文件类型
__name__ if __name__ == '__main__': 执行文件的代码 __all__ >>>: from md import *
-
模块的查找顺序
1.内存 2.内置 3.执行文件所在的sys.path """ 1.将模块所在的路径添加到执行文件的sys.path """
-
绝对导入与相对导入
from aaa.bbb.ccc import md # 项目根目录 from .. import md # 相对导入
-
包的概念
多个模块文件的集合(文件夹) # 含有__init__.py文件
今日内容概要
-
包的具体使用
-
编程思想的转变
-
软件开发目录规范
-
python常用内置模块
collections模块 time模块与datetime模块 os模块与sys模块
今日内容详细
包的具体使用
虽然python3对包的要求降低了 不需要__init__.py也可以识别,
但是为了兼容性考虑最好还是加上__init__.py
1.如果只想用包中某几个模块 那么还是按照之前的导入方式即可
from aaa import md1, md2
--------------------------------------------
2.如果直接导入包名
import aaa
导入包名其实就是加载或者导包下面的__init__.py文件!!!!!!
与__init__.py平行的其他.py并不会被直接导入!
该__init__.py文件内有什么名字,就可以通过包名点什么名字
.
.
包里面的__init__.py文件的作用:
比如作为一个模块开发人员,把自己写的好多模块用一个包aaa装起来,然后写一个__init__.py文件,在这个文件里面提前帮以后要导你包的人,写好到底他们将来,可以用你包里面的哪些模块名字,就是说__init__.py文件里面有什么名字,就可以在执行文件里面先 import aaa,后通过包名加点的方式点出_init__.py文件里面的名字,比如当在__init__.py文件里面写from aaa import md1,md2 后,就可以在执行文件里面通过aaa.的方式点出md1与md2,再加点就可以点出md1与md2模块里面所有的名字了!!!!!! 这就是__init__.py文件的作用!!!
编程思想的转变
1.面条版阶段
所有的代码全部堆叠在一起
2.函数版阶段
根据功能的不同封装不同的函数
3.模块版阶段
根据功能的不同拆分成不同的py文件
"""
第一个阶段可以看成是直接将所有的数据放在C盘
视频 音频 文本 图片
第二个阶段可以看成是将C盘下的数据分类管理
视频文件夹 音频文件夹 文本文件夹 图片文件夹
第三个阶段可以看成是将C盘下的数据根据功能的不同划分到更合适的位置
系统文件夹 C盘
视频文件夹 D盘
图片文件夹 E盘
ps:类似于开公司(小作坊 小公司 上市公司)
为了资源的高效管理
"""
软件开发目录规范
1.文件及目录的名字可以变换 但是思想是不变的 分类管理
2.目录规范主要规定开发程序的过程中针对不同的文件功能需要做不同的分类
myproject项目文件夹
1.bin文件夹 主要存放项目启动文件 就是一些后缀名是exe的文件
start.py 启动文件可以放在bin目录下 也可以直接在项目根目录
2.conf文件夹 主要存放项目配置文件
settings.py 里面存放项目的默认配置 一般都是全大写
3.core文件夹 主要存放项目核心文件
src.py 里面存放项目核心功能
4.interface文件夹 主要存放项目接口文件
goods.py 根据具体业务逻辑划分对应的文件
user.py
account.py
5.db文件夹 主要存放项目相关数据
userinfo.txt
db_handler.py 存放数据库操作相关的代码
6.log文件夹 主要存放项目日志文件
log.log
7.lib文件夹 主要存放项目公共功能
common.py
8.readme文件 主要存放项目相关说明
9.requirements.txt文件 主要存放项目所需模块及版本!!!!!!主要就是记录项目所需要的模块,用来提醒使用这个项目的人,要提前把requirements文件里面罗列的模块提前准备好,否则这个项目就运行不了!!!这个文件名字不能写错,不然在文件里面就不能一次性把所有要装的模块全部一次性都装好!!!
10. date 主要用于存放数据的文件
configuration 配置
core 核心
interface 接口、界面
log 日志
db datebase 数据库
lib
readme 自述 读我
requirement 要求
一次性安装
.
.
.
.
.
.
.
常用内置模块之collections模块
1.具名元组:namedtuple
1.具名元组:namedtuple 就是一个有名字的元组!!! 做一些坐标系的项目或者一些小游戏项目可能会用!!!
语法结构 Point = namedtuple('Point', ['x', 'y'])
point 就是一个变量名 'Point'是你想给元组起的名字名字
from collections import namedtuple
qqqq = namedtuple('点', ['x', 'y']) # 生成一个具名元组,名字已经起好了,元组里面可以有好多值
p1 = qqqq(1, 2) # 给具名元组传值
print(p1)
点(x=1, y=2) # 就生成了带名字的元组了
print(p1.x) # 还可以同过点的方法取值!!!
1
print(p1.y) # 2
.
.
card = namedtuple('扑克牌', ['num', 'color']) # 生成具名元组
c1 = card('A', '黑♠') # 给具名元组传值
c2 = card('A', '红♥') # 给具名元组传值
print(c1, c1.num, c1.color) # 打印具名元组、已经通过具名元组取得值
print(c2, c2.num, c2.color)
2.队列
2.队列
队列与堆栈
队列:先进先出
堆栈:先进后出
队列和堆栈都是一边只能进一边只能出
队列模块:
from collections import deque 双端队列
from multiprocessing import queue
尾部弹出
.
.
有序字典 按照键添加得顺序,作为后续取得依据
from collections import OrderedDict
od = OrderedDict([('a',1),('b',2),('c',3)])
print(od)
计数器
from collections import Counter
res = 'abacababaccbcbaca'
print(Counter(res))
.
.
.
.
.
.
常用内置模块---------时间模块
和时间有关系的我们就要用到时间模块。在使用模块之前,应该首先导入这个模块。
import time
import time
"""
三种时间表现形式
1.时间戳 timestamp
时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。秒数
2.结构化时间 struct time
主要是给计算机看的 人看不适应
3.格式化时间 Format time
主要是给人看的
"""
print(time.time() # 获取当前时间戳
1666150097.5481427
print(time.localtime()) # 转结构化时间
time.struct_time(tm_year=2022, tm_mon=10, tm_mday=19, tm_hour=11, tm_min=32, tm_sec=50, tm_wday=2, tm_yday=292, tm_isdst=0)
print(time.strftime('%Y-%m-%d')) # 转格式化时间strftime括号里面需要自己写的
2022-10-19
print(time.strftime('%Y/%m/%d')) # 链接符可以随便写,%和年月日等时间的缩写不能改 注意月m与日d的缩写都是小写,其他几个都是大写
2022/10/19
print(time.strftime('%Y/%m/%d %H:%M:%S')) # 根据需求留几个都行!
2022/10/19 11:30:20
print(time.strftime('%Y/%m/%d %X')) # 时分秒可以直接用一个X代替
2022/10/19 11:31:18
time.sleep(10)
让程序原地停止,指定的秒数
.
结构化时间
.
索引(Index) 属性(Attribute 值(Values)
0 tm_year(年 比如2011
1 tm_mon(月 1 - 12
2 tm_mday(日 1 - 31
3 tm_hour(时 0 - 23
4 tm_min(分 0 - 59
5 tm_sec(秒 0 - 60
6 tm_wday(weekday 0 - 6(0表示周一)
7 tm_yday(一年中的第几天 1 - 366
8 tm_isdst(是否是夏令时 默认为0
.
.
.
几种格式之间的转换,转换的依据都是依据结构化时间来的
.
.
.
.
.
.
import datetime
1.datetime.now() # 获取当前datetime
datetime.utcnow() # 获取当前格林威治时间
from datetime import datetime
获取当前本地时间
a=datetime.now()
print('当前日期:',a)
获取当前世界时间
b=datetime.utcnow()
print('世界时间:',b)
import datetime
print(datetime.datetime.now()) # 2022-10-19 11:58:23.682282
print(datetime.datetime.today()) # 2022-10-19 11:58:23.682282
print(datetime.date.today()) # 2022-10-19 只有年月日
'''
datetime 年月日 时分秒
date 年月日
time 时分秒(后续会有此规律)
'''
from datetime import date, datetime
print(date.today())
通过datetime自己创建一个时间
import datetime
c = datetime.datetime(2017, 5, 23, 12, 20)
print('指定日期:',c)
指定日期: 2017-05-23 12:20:00
.
strptime()方法的语法
time.strptime(string[, format])
from datetime import datetime
d=datetime.strptime('2017/9/30','%Y/%m/%d')
print(d)
2017-09-30 00:00:00
strptime()方法可以根据指定的格式把一个时间字符串解析为时间元组。
strptime()方法分析表示根据格式的时间字符串。返回值是一个struct_time所返回gmtime()或localtime()。
e=datetime.strptime('2017年9月30日星期六','%Y年%m月%d日星期六')
print(e)
f=datetime.strptime('2017年9月30日星期六8时42分24秒','%Y年%m月%d日星期六%H时%M分%S秒')
print(f)
.
.
.
.
.
时间差值 timedelta时间间隔对象
import datetime
ctime = datetime.date.today()
print(ctime)
time_del = datetime.timedelta(days=3)
print(ctime + time_del)
ctime = datetime.datetime.today()
print(ctime)
time_del = datetime.timedelta(minutes=20)
print(ctime + time_del)
.
.
.
.
.
常用内置模块--------随机数模块 重要!!!
random.choice 随机抽取1个
random.sample 随机抽取指定数目的样本
import random
print(random.random()) # random 随机产生0到1之间的小数
print(random.randint(1, 6)) # randint 随机产生1到6之间的整数
print(random.randrange(1, 100, 2)) # randrange 随机产生1到100之间的整数,并且指定了步长
print(random.choice(['一等奖', '二等奖', '三等奖', '谢谢惠顾'])) # choice 随机抽取一个样本
'二等奖'
print(random.choices(['一等奖', '二等奖', '三等奖', '谢谢惠顾'])) # 随机抽取一个样本
['二等奖'] 上面结果是字符串,这里是包着字符串的列表
print(random.sample(['jason', 'kevin', 'tony', 'oscar', 'jerry', 'tom'], 3)) # 随机抽指定样本数
['tom', 'jerry']
.
.
.
.
.
实现洗牌的操作
shuffle 洗牌、拖着脚走、随机播放装置
l1 = [2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A']
random.shuffle(l1) # 随机打乱传进来的数据集!!!!!!
print(l1)
.
.
.
.
.
.
实现图片验证码
'''产生图片验证码: 每一位都可以是大写字母 小写字母 数字 随机的 先想生成4位'''
主体功能代码:
import random
for i in range(4):
# 1.先产生随机的大写字母 小写字母 数字
random_upper = chr(random.randint(65, 90)) # 基于ASCII码 数字转字母A-Z
random_lower = chr(random.randint(97, 122)) # a-z
random_int = random.randint(0, 9) #
temp = random.choice([random_upper, random_lower, random_int]) # 随机三选一
print(temp,end='') # 去掉自动换行,4个字符串就连起来了
优化版代码:
def get_code(n):
code = ''
for i in range(n):
# 1.先产生随机的大写字母 小写字母 数字
random_upper = chr(random.randint(65, 90)) # 基于ASCII码 数字转字母A-Z
random_lower = chr(random.randint(97, 122)) # a-z
random_int = str(random.randint(0, 9)) # 因为整形与字符串不能相加,所以加个str 把数字转为字符串
temp = random.choice([random_upper, random_lower, random_int]) # 2.随机三选一
code += temp # 字符串的拼接操作
return code
res = get_code(10)
print(res)
res = get_code(4)
print(res)
.
.
.
.
作业
1.整理今日内容及博客
2.将之前较为复杂的编程题拿出来练练
后面马上有几个更大的代码作业 时间紧急!
3.预习明日内容
os sys json hashlib ...
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY