包的具体使用与collections模块time模块,random模块
包的具体使用
我们想要在python3中使用包,虽然相对python2来说可以不用添加__init__.py, 但是为了兼容性更好还是加上__init__
在导入包的时候 索要名字其实是跟包里面的__init__.py要
1.如果想直接通过包的名字使用包里面所有的模块 那么需要在__init__.py中提前导入
上述方式的好处在于__init__可以提前帮你准备好可以使用的名字
2.也可以直接忽略__init__的存在使用绝对导入即可
上述方式的好处在于不需要考虑包的存在 直接当成普通文件夹即可
编程思想的演变
1.面条版阶段
所有的代码全部堆叠在一起。(我们之前的作业)
2.函数版阶段
根据功能的不同封装不同的函数(学过函数之后使用的方法)
3.模块板阶段
根据功能的不同拆分成不同的py文件。方便管理
软件开发目录规范
1.为了方便 针对不同的文件做出不同功能的分类和管理.
1. bin 文件夹 # 主要存放项目启动文件
start.py # 启动文件可以放在bin目录下,也可以直接放在项目根目录
2. conf 文件夹 # 主要存放项目配置文件
settings.py # 存放项目的默认配置
3.core文件夹 # 存放项目的核心文件
src.py
4.lib文件夹 # 存放项目公共功能
common.py
5. interface文件夹 #存放项目接口文件
goods.py # 根据具体业务逻辑划分对应的文件
user.py
account.py
6. db文件夹 # 主要存放项目相关数据
userinfo.txt
db_handler.py # 存放数据库操作相关代码
7.log文件夹 # 存放项目日志文件
log.log
8. readme文件 # 存放项目相关说明书
9. requirements.txt文件 #存放项目所需模块及版本
常用内置模块值collections模块
具名元组: namedtuple
我们在使用不可变元组时, eg 我们需要查看一个坐标。(2,3)很难看出这是一个坐标,我们可以使用namedtuple来表述出更加详细。
from collections import namedtuple
# 1.建立一个元组对象模板
point = namedtuple('坐标', ['x', 'y'])
p1 = point(3, 5)
print(p1)
# 坐标(x=3, y=5)
# 创建诸多元组数据
person = namedtuple('周衍根',['项目','价格'])
c1 = person('spa', 198)
print(c1)
# 周衍根(项目='spa', 价格=198)
person = namedtuple('贵宾','name project price')
c1 = person('周衍根','spa', 198)
print(c1)
#贵宾(name='周衍根', project='spa', price=198)
扑克牌:
card = namedtuple('扑克牌', ['num', 'color'])
c1 = card('A', '黑♠')
c2 = card('A', '红♥')
print(c1.num, c1.color) # A 黑♠
print(c2.num, c2.color) # A 红♥
统计:Counter
可以追踪数据集中数据出现的次数,和我们之前做的一道作业差不多,这是简写
from collections import Counter
c = Counter('abcdeabcdabcaba')
print(c)
# Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
得到的是一种类似字典的数据类型。
deque 队列
队列 先进先出,默认是只有一端进,一端出
可以使用append的方法从后面增加
from collections import deque
l1 = deque([11,22,33])
l1.append(35)
print(l1)
# deque([11, 22, 33, 35])
默认是从尾部添加
# 这里的 append 也可以调整方向从左边新增 使用appendleft
l1.appendleft(8)
print(l1)
# 还可以使用pop方法弹出,pop也可以调整从左边弹
l1.pop()
print(l1)
l1.popleft()
print(l1)
------------------------------------------------------------------------------------
import queue
a1 = queue.Queue(2) # 最多只能放2个数据
a1.put(111)
a1.put(222)
a1.put(333)
print(a1.get())
print(a1.get())
print(a1.get()) # 上面我们规定了最多只能放2个数据,如果超出则程序会原地等待
常用内置模块之时间模块
import time
time有三种时间表现形式
1.时间戳
2.结构化时间
3.格式化时间
------------------------------------------------------------------------------------
1.时间戳
就是time.time() 方法调用出来的
距离1970年00点00时00分 到现在的秒数
import time
print(time.time()) # 1666165654.0909235
------------------------------------------------------------------------------------
2.结构化时间
结构化时间主要是给电脑看的
time.localtime()
import time
print(time.localtime()) # 本地时区 time.struct_time(tm_year=2022, tm_mon=10, tm_mday=19, tm_hour=15, tm_min=48, tm_sec=25, tm_wday=2, tm_yday=292, tm_isdst=0)
print(time.gmtime()) # UTC时区的struct_time
3.格式化时间
给人看的
时间格式 :2022/10/19 15:50:00
time.strftime()
"""%Y 年 %m 月 %d 日 %H 时 %M 分 %S 秒 %X 本地相应时间 """
1.使用方法 time.strftime()
import time
res = time.strftime('%Y年%m月%d日%H时%M分%S秒')
print(res) # 2022年10月19日15时54分02秒
2.使用 strptime 可以把格式化时间转成 结构化时间
res = time.strptime('1994年11月11日11时11分11秒','%Y年%m月%d日%H时%M分%S秒') #time.struct_time(tm_year=1994, tm_mon=11, tm_mday=11, tm_hour=11, tm_min=11, tm_sec=11, tm_wday=4, tm_yday=315, tm_isdst=-1)
print(res)
-----------------------------------------------------------------------------------
datetime 模块
"""datetime 获取年月日时分秒
date 获取年月日
time 时分秒"""
datetime.strptime()
from datetime import datetime
res = datetime.strptime('1994年11月11日11时11分11秒','%Y年%m月%d日%H时%M分%S秒')
print(res) # 1994-11-11 11:11:11
-----------------------------------------------------------------------------------
time.sleep(5) 睡眠 停下 5秒
-----------------------------------------------------------------------------------
from datetime import date,datetime
print(date.today()) #获取当前年月日 2022-10-19
print(datetime.today()) # 获取当前年月日 时分秒 2022-10-19 16:17:40.603321
-----------------------------------------------------------------------------------
import datetime
a = datetime.datetime(1994,11,11)
print('出生年月',a) # 出生年月 1994-11-11 00:00:00
可以获取指定日期
-----------------------------------------------------------------------------------
import datetime
a = datetime.date.today()
print(b)
b = datetime.timedelta(days =1)
print(a + b)
可以设置定时任务, 假设a 时开始时间, b 时结束时间 给b设定一个条件。 1天后
2022-10-19
2022-10-20
这是给出的条件是天, 也可以设置分钟如minutes。 秒也行。
常用内置模块之随机数模块(random)
可以根据我们给的条件产生一个随机数
import random
print(random.random()) # 随机产生一个0到1之间的小数 基本用不到
print(random.uniform(1,3)) # 随机产生一个1到3之间的小数 基本用不到
print(random.randint(1,3)) # 随机产生一个1到3之间的整数,这个功能可以用来随机获取数据,比如说微信里的摇骰子
random.shuffle()
可以随机打乱一个数据集
l1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14]
random.shuffle(l1)
print(l1) # [6, 14, 4, 8, 9, 1, 13, 3, 11, 2, 12, 7, 5]
抽奖也可以
random.choice() # 随机抽取一个
l1 = ['iphone 14', '大彩电', '4090', '1060', '750']
print(random.choice(l1))
print(random.choices(l1)) # choices 抽出来是一个列表
random.sample(l1,2) # 指定数量抽取
l1 = ['iphone 14', '大彩电', '4090', '1060', '750']
print(random.sample(l1, 2))
利用random模块产生图片验证函数写法
import random
def get_code(n):
code = ''
for i in range(n):
# 先产生随机的大写,小写字母,还有数字
random_upper = chr(random.randint(65,90))
# chr 可以产生一个对应数字的英文字母
random_lower = chr(random.randint(97,122))
# 数字要转成字符串
random_int = str(random.randint(0,6))
# 随机三选一
temp = random.choice([random_upper, random_lower, random_int])
code += temp
return code
res = get_code(7) # 7位数验证码
print(res)