编程思想的转变 软件开发目录规范 collections、time、datetime、 random模块
编程思想的转变
1.面条版阶段
所有的代码全部堆叠在一起
2.函数版阶段
根据功能的不同封装不同的函数
3.模块版阶段
根据功能的不同拆分成不同的py文件
"""
第一个阶段可以看成是直接将所有的数据放在C盘
视频 音频 文本 图片
第二个阶段可以看成是将C盘下的数据分类管理
视频文件夹 音频文件夹 文本文件夹 图片文件夹
第三个阶段可以看成是将C盘下的数据根据功能的不同划分到更合适的位置
系统文件夹 C盘
视频文件夹 D盘
图片文件夹 E盘
ps:类似于开公司(小作坊 小公司 上市公司)
为了资源的高效管理
"""
软件目录开发规范(重要)
1.文件及目录的名字可以变换 但是思想是不变的 分类管理
2.目录规范主要规定开发程序的过程中针对不同的文件功能需要做不同的分类
以下内容要熟练掌握,达到背诵的程度>>>
myproject项目文件夹:
1.bin文件夹 主要存放项目启动文件
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文件 主要存放项目所需模块及版本
内置模块:collections模块
简介
collections模块提供了一些高级的数据类型供我们使用,相当于原有python数据类型的升级版本,功能更强大。主要提供了dict、list、set、tuple这些类型的代替选择,这个模块用的不多,取常用的功能了解即可。
具名元组 namedtuple
实现二维坐标系
from collections import namedtuple # 导入namedtuple函数
# 1.表示二维坐标系
point = namedtuple('Point', ['x', 'y']) # point是元祖的名字 x、y是元祖中元素的名字
print(type(point)) # <class 'type'>
# 2.使用point生成具名元组
p1 = point(1, 2)
print(type(p1)) # <class '__main__.Point'>
print(p1) # Point(x=1, y=2)
p2 = point(9.9,100)
print(p2) # Point(x=9.9, y=100)
# 取出具名元祖中的元素
print(p2.x, p2.y) # 9.9 100
实现扑克牌
card = namedtuple('扑克牌', ['num', 'color'])
c1 = card('A', '黑♠')
c2 = card('A', '红♥')
print(c1, c1.num, c1.color) # 扑克牌(num='A', color='黑♠') A 黑♠
print(c2, c2.num, c2.color) # 扑克牌(num='A', color='红♥') A 红♥
队列与堆栈
队列是先进先出的,类比现实生活中的排队做核酸,你先来肯定你先被捅嗓子眼= =
堆栈是先进后出,类似往箱子放东西,先放进去的东西最后才能取出来=。=
collection.deque()实现双端队列 (了解)
# 队列和堆栈都是只有一边能进出
# 双端队列是:两边都能进 两边都能出
# 1.deque实现双端队列
from collections import deque # 不常用 了解即可
q = deque([1,2,3])
print(q.pop()) # 3
print(q.popleft()) # 1 # 从左边弹出
q.appendleft('miku') # 在左边添加
print(q) # deque(['miku', 2])
有序字典 OrderedDict
from collections import OrderedDict
od = OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 4)]) # od现在是有序字典了!
print(od) # OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 4)])
print(od['a']) # 用键取值
od['name'] = 'alice'
print(od) # OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 4), ('name', 'alice')])
for i in od: # 支持for循环 只有键参与
print(i)
计数器类型 Count
# 1.用来统计字符串里字符的个数
res = 'mmmm uuu hhh n'
print(Counter(res)) # Counter({'m': 4, ' ': 3, 'u': 3, 'h': 3, 'n': 1})
back = Counter('你好哇')
print(back) # Counter({'你': 1, '好': 1, '哇': 1})
print(type(back)) # <class 'collections.Counter'>
内置模块:time模块
时间的三种表现形式
三种时间表现形式
1.时间戳
秒数
2.结构化时间
主要是给计算机看的 人看不适应
3.格式化时间
主要是给人看的
time.time()
# 1.时间戳
print(time.time()) # 1666164611.2037244 # 时间戳
print(type(time.time())) # <class 'float'>
time.localtime()
# 2.结构化时间
print(time.localtime()) # time.struct_time(tm_year=2022, tm_mon=10, tm_mday=19, tm_hour=15, tm_min=30, tm_sec=59, tm_wday=2, tm_yday=292, tm_isdst=0)
print(type(time.localtime())) # <class 'time.struct_time'> # 产生当前的结构化时间
time.strftime(重要)
# 3.格式化时间
print(time.strftime('%Y-%m-%d')) # 2022-10-19 # 注意:Y大写 m小写 d小写
print(time.strftime('%Y/%m/%d')) # 2022/10/19 # 分隔的部分可以改
print(type(time.strftime('%Y-%m-%d'))) # <class 'str'> # 产生str # 意思是str-format-time吗=。=
print(time.strftime(('%Y/%m/%d %H:%M:%S'))) # 2022/10/19 15:41:50 # 要背下来!!
print(time.strftime(('%Y/%m/%d %X'))) # 2022/10/19 15:42:36
# 更多尝试
print(time.strftime('%D')) # 10/19/22
print(time.strftime('%h')) # Oct
time.sleep(10) # 让程序原地阻塞指定的秒数
菜鸟教程:https://www.runoob.com/python/att-time-strftime.html
三种时间转换关系
timestamp = time.time() # 生成时间戳
print(timestamp) # 1666176687.4902158
struct_time = time.localtime(timestamp) # 时间戳 ——localtime——> 结构化时间
print(struct_time) # time.struct_time(tm_year=2022, tm_mon=10, tm_mday=19, tm_hour=18, tm_min=51, tm_sec=27, tm_wday=2, tm_yday=292, tm_isdst=0)
format_time = time.strftime('%Y/%m/%d %H:%M:%S',struct_time) # 2022/10/19 19:08:36 # 结构化时间 ——strftime——> 格式化时间
print(format_time) # 2022/10/19 19:24:04
new_struct = time.strptime(format_time,'%Y/%m/%d %H:%M:%S') # 把格式化时间转为结构化时间了 这里参数要反一下
print(new_struct) # time.struct_time(tm_year=2022, tm_mon=10, tm_mday=19, tm_hour=19, tm_min=18, tm_sec=14, tm_wday=2, tm_yday=292, tm_isdst=-1)
new_stamp = time.mktime(struct_time)
print(new_stamp) # 1666178401.0 # 一通转换下来 时间戳小数点后面的都没了 神奇喔 =。=
# 1.struct_time参数含义:
'''time.struct_time(tm_year=2022, tm_mon=10, tm_mday=19, tm_hour=19, tm_min=18, tm_sec=14,
tm_wday=2, tm_yday=292, tm_isdst=-1)'''
int tm_sec; /* 秒 – 取值区间为[0,59] */
int tm_min; /* 分 - 取值区间为[0,59] */
int tm_hour; /* 时 - 取值区间为[0,23] */
int tm_mday; /* 一个月中的日期 - 取值区间为[1,31] */
int tm_mon; /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */
int tm_year; /* 年份,其值等于实际年份减去1900 */
int tm_wday; /* 星期 – 取值区间为[0,6],其中0代表星期一,1代表星期二,以此类推 */
int tm_yday; /* 从每年的1月1日开始的天数 – 取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */
int tm_isdst; /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的时候,tm_isdst为0;不了解情况时,tm_isdst()为负。
内置模块:datetime模块
导入
from datetime import date,datetime # 导入date类,datetime类
# 1.date、datetime是什么?
# 实际上用的就是datetime.py文件 里面的两个类:date类 datetime类
print(date) # <class 'datetime.date'>
print(datetime) # <class 'datetime.datetime'>
datetime类
datetime.now()/datetime.today()
# now today都是返回当前时间
print(datetime.now()) # 2022-10-19 15:52:23.323534
print(datetime.today()) # 2022-10-19 15:54:06.581871
print(type(datetime.now())) # <class 'datetime.datetime'> # 返回一个datetime对象
datetime.utcnow()
print(datetime.utcnow()) # 2022-10-19 08:04:06.799263 # 慢8个小时 # 协调通用时间(UTC)
c = datetime(2017, 5, 23, 12, 20)
datetime.strptime()
# 1.给datetime传入数字 会自动帮你格式化时间
c = datetime(2017, 5, 23, 12, 20)
print('指定日期: %s'% c) # 指定日期: 2017-05-23 12:20:00
# 2.包含时间信息的字符串 通过一些匹配 生成标准的时间格式
d=datetime.strptime('2017/9/30','%Y/%m/%d')
print(d) # 2017-09-30 00:00:00
e=datetime.strptime('2017年9月30日星期六','%Y年%m月%d日星期六')
print(e) # 2017-09-30 00:00:00
f=datetime.strptime('2017年9月30日星期六8时42分24秒','%Y年%m月%d日星期六%H时%M分%S秒')
print(f) # 2017-09-30 08:42:24
timedelta()
# 1.用于完成延时任务
ctime = date.today() # 获取当前时间
print(ctime) # 2022-10-19
time_del = timedelta(days=3)
print(time_del,type(time_del)) # 3 days, 0:00:00 # <class 'datetime.timedelta'>
print(ctime + time_del) # 2022-10-22
print(timedelta(minutes=20)) # 0:20:00 # 分钟也支持
date.today()
# 1.date类中的方法
print(date.today()) # 2022-10-19 # 返回今天日期
print(type(date.today())) # <class 'datetime.date'>
规律总结
'''
不同的方法 最后输出的时间格式不相同:
datetime 年月日 时分秒
date 年月日
time 时分秒(后续会有此规律)
'''
内置模块:random模块
基本使用
print(random.random()) # 0.7713324417976831 # 随机产生0到1之间的小数
print(random.randint(1, 6)) # 3 # 随机产生1到6之间的整数
print(random.randrange(1, 6)) # 随机产生指定的整数 # 支持步长=。= 服从range左开右闭的特点
print(random.choice(['一等奖', '二等奖', '三等奖', '谢谢惠顾'])) # 随机抽取一个样本 '二等奖'
print(random.choices(['一等奖', '二等奖', '三等奖', '谢谢惠顾'])) # 随机抽取一个样本 ['二等奖']
# 保留原来的数据类型 传入一个列表 输出一个列表
print(random.sample(['jason', 'kevin', 'tony', 'oscar', 'jerry', 'tom'], 2)) # 随机抽指定样本数 ['tom', 'jerry']
l1 = [2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A']
random.shuffle(l1) # 随机打乱数据集
print(l1) # ['Q', 'J', 7, 2, 3, 9, 'K', 'A', 10, 5, 4, 6, 8]
random模块实现图片验证码
'''产生图片验证码: 每一位都可以是大写字母 小写字母 数字 4位'''
'''产生图片验证码: 每一位都可以是大写字母 小写字母 数字 4位'''
def get_code(n):
code = ''
for i in range(n):
# 1.先产生随机的大写字母 小写字母 数字
random_upper = chr(random.randint(65, 90))
random_lower = chr(random.randint(97, 122))
random_int = str(random.randint(0, 9))
# 2.随机三选一
temp = random.choice([random_upper, random_lower, random_int])
code += temp
return code
res = get_code(10) # 产生一个十位的验证码
print(res) # vD82pl4BLH
res = get_code(4) # 产生一个四位的验证码
print(res) # zC2n
补充
Queue实现队列(常用)
# 1.基本使用
from multiprocessing import Queue
list_q = Queue(3) # 产生一个可以容纳三个数据的队列 # 不是可迭代对象
list_q.put('alice')
list_q.put('tifa')
list_q.put('cloud')
print(list_q.get()) # alice
print(list_q.get()) # tifa
print(list_q.get()) # cloud # 满足先进先出
# 2.阻塞
from multiprocessing import Queue
list_q = Queue(3) # 产生一个可以容纳三个数据的队列 # 不是可迭代对象
list_q.put('alice')
list_q.put('tifa')
list_q.put('cloud')
list_q.put('oshio') # 由于这是一个只能容纳3个元素的队列 # 所以这个oshio插不进去
# 程序会阻塞在这里 # 在等待有人从队列出来
# 3.解决
from multiprocessing import Queue
list_q = Queue(3) # 产生一个可以容纳三个数据的队列 # 不是可迭代对象
list_q.put('alice')
list_q.put('tifa')
list_q.put('cloud')
list_q.get()
list_q.put('oshio')
print(list_q.get()) # tifa
print(list_q.get()) # cloud
print(list_q.get()) # oshio
做题
# 1.将2020-11-11 转成时间戳
str_time = '2020-11-11'
struct_time = time.strptime('2020-11-11','%Y-%m-%d') # 匹配的时候要写全
print(time.mktime(struct_time)) # 1605024000.0
# 2.根据年月日判断是那一年的第几天
now_time = '2022年10月19日'
struct_time = time.strptime(now_time,'%Y年%m月%d日') # 格式化时间————>结构化时间
print(struct_time)
print(struct_time.tm_yday) # 通过结构化时间取值 今天是今年的第292天
print(365-struct_time.tm_yday) # 今年还剩73天
# 3.查看时间戳200000000对应的年月日
time_stamp = 2000000000 # 时间戳得是个数字 # 不能是字符串
s_time = time.localtime(time_stamp) # 时间戳转结构化时间
f_time = time.strftime('%Y/%m/%d',s_time) # 结构化时间转格式化时间
print(f_time) # 2033/05/18
# 4.批量生成11位手机号码
# 手机号以135 137 189开头
# 后8位是随机生成的8个数字
third = [135,137,189][random.randint(0,2)]
suffix = random.randint(9999999,100000000)
print(str(second)+str(suffix))