今日内容详细
包的具体使用
虽然python3对包的要求降低了 不需要__init__.py也可以识别 但是为了兼容性考虑 最好还是加上__init__.py
1.如果只想用包中某几个模块 那么还是按照之前的导入方式即可
from aaa import md1, md2
2.如果直接导入包名
import aaa
导入包名其实就是导包下面的__init__.py文件,该文件内有什么名字就可以通过包名点什么名字
若__init__.py文件没有导入包其他的模块 那么只能使用__init__文件中的名字其他模块中的名字并不能使用
编程思想的转变
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模块还提供了几个额外的数据类型:Counter、deque、defaultdict、namedtuple和OrderedDict等。
1.namedtuple: 生成可以使用名字来访问元素内容的tuple
2.deque: 双端队列,可以快速的从另外一侧追加和推出对象
3.Counter: 计数器,主要用来计数
4.OrderedDict: 有序字典
5.defaultdict: 带有默认值的字典
1.具名元组:namedtuple用法
我们知道tuple可以表示不变集合,例如,一个点的三维坐标就可以表示成:
# 表示三维坐标系
p = (1, 2, 5)
print(p) # (1, 2, 5)
但是,看到(1, 2,5),很难看出这个tuple是用来表示一个三维坐标的。
此时,namedtuple就派上了用场:
from collections import namedtuple
# namedtuple('名称', [属性list]):
Point = namedtuple('Point', ['x', 'y', 'z'])
p = Point(1, 2, 5)
print(p) # point(x=1, y=2, z=5)
print(p.x, p.y, p.z) # 1 2 5
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 红♥
2.deque的用法
使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。
deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:
from collections import deque
q = deque(['白给', '小钱', '小魏', '小李', '小白'])
q.append('小黑') # 默认添加在右侧尾部
print(q) # deque(['白给', '小钱', '小魏', '小李', '小白', '小黑'])
q.appendleft('python3')
print(q) # deque(['python3', '白给', '小钱', '小魏', '小李', '小白', '小黑'])
deque除了实现list的append()和pop()外,还支持appendleft()和popleft(),这样就可以非常高效地往头部添加或删除元素。
q.pop() # 默认从尾部删除
print(q) # deque(['白给', '小钱', '小魏', '小李'])
q.popleft() # 从头部删除,不能传值
print(q) # deque(['小钱', '小魏', '小李', '小白'])
3.Counter的用法
Counter类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。计数值可以是任意的Interger(包括0和负数)
res = 'abcdeabcdabcaba'
from collections import Counter
ret = Counter(res)
print(ret) # Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
4.OrderedDict的用法
使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。
如果要保持Key的顺序,可以用OrderedDict:
from collections import OrderedDict
d = {'name': '小钱', 'age': 23, 'gender': 'male', 'id': 123}
d1 = OrderedDict(d)
print(d1) # OrderedDict([('name', '小钱'), ('age', 23), ('gender', 'male'), ('id', 123)])
print(d1['age']) # 获取key对应的值内容 23
注意:OrderedDict的Key会按照插入的顺序排列,不是Key本身排序
from collections import OrderedDict
d = OrderedDict()
d['name'] = '小钱'
d['age'] = 23
d['work'] = '摸鱼'
d['id'] = 123
print(d.keys()) # 按照插入的Key的顺序返回 odict_keys(['name', 'age', 'work', 'id'])
5.defaultdict的用法
方式一:原生字典解决方法
l1 = [11, 22, 33, 44, 55, 66, 77, 88, 99]
# {'k1':[小于60], 'k2':[大于60]}
# 1.先定义字典数据
new_dict = {'k1': [], 'k2': []}
# 2.for循环列表数据
for i in l1:
if i < 60:
new_dict.get('k1').append(i)
else:
new_dict.get('k2').append(i)
print(new_dict)
方式二:defaultdict字典解决方法
from collections import defaultdict
l1 = [11, 22, 33, 44, 55, 66, 77, 88, 99]
my_dict = defaultdict(list)
for i in l1:
if i < 60:
my_dict['k1'].append(i)
else:
my_dict['k2'].append(i)
print(my_dict) # defaultdict(<class 'list'>, {'k1': [11, 22, 33, 44, 55], 'k2': [66, 77, 88, 99]})
使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict:
from collections import defaultdict
d = defaultdict(lambda: 'N/A')
d['name'] = '小钱'
print(d['name']) # name存在 返回值小钱
print(d['age']) # age不存在,返回默认值N/A
时间模块
1.三种时间表现形式
1.时间戳
秒数
2.结构化时间
主要是给计算机看的 人看不适应
3.格式化时间
主要是给人看的
2.python中时间日期格式化符号:
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身
3.元组(struct_time) :struct_time元组共有9个元素共九个元素
4.代码实战
import time
print(time.time()) # 从1970年1月1日00:00:00开始按秒计算的偏移量
print(time.localtime()) # 时间元组:localtime将一个时间戳转换为当前时区的 time.struct_time(tm_year=2022, tm_mon=10, tm_mday=19, tm_hour=16, tm_min=52, tm_sec=7, tm_wday=2, tm_yday=292, tm_isdst=0)
print(time.strftime('%Y-%m-%d')) # 年-月-日2022-10-19
print(time.strftime('%Y/%m/%d')) # 年/月/日2022/10/19
print(time.strftime('%Y/%m/%d %H:%M:%S')) # 年/月/日 时:分:秒 2022/10/19 16:55:01
print(time.strftime('%Y/%m/%d %X')) # 2022/10/19 16:55:01 %X = %H:%M:%S
time.sleep(10) # 让程序原地阻塞指定的秒数
import datetime
# 自定义日期
res = datetime.date(2019, 7, 15)
print(res) # 2019-07-15
print(datetime.datetime.now()) # 2022-10-19 16:57:09.997134 获取本地时间 年 月 日 时 分 秒
print(datetime.datetime.today()) # 2022-10-19 16:57:09.997134 获取本地时间 年 月 日 时 分 秒
print(datetime.date.today()) # 2022-10-19 获取本地时间 年月日
'''
datetime 年月日 时分秒
date 年月日
time 时分秒(后续会有此规律)
'''
from datetime import date, datetime
print(date.today()) # 2022-10-19
print(datetime.today()) # 2022-10-19 17:04:50.987897
print(datetime.utcnow()) # 2022-10-19 09:04:50.987896 UTC时间比我们本地早8小时
import datetime
c = datetime.datetime(2017, 5, 23, 12, 20)
print('指定日期:',c) # 指定日期: 2017-05-23 12:20:00
from datetime import datetime
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
import datetime
# 获得本地日期 年月日
ctime = datetime.date.today()
print(ctime) # 2022-10-19
# 定义操作时间 day=3 也就是可以对另一个时间对象加3天或者减少3天
time_del = datetime.timedelta(days=3)
print(ctime + time_del) # 2022-10-22
ctime = datetime.datetime.today()
print(ctime) # 2022-10-19 17:16:20.168040
time_del = datetime.timedelta(minutes=20)
print(ctime + time_del) # 2022-10-19 17:36:20.168040
随机数模块
import random
print(random.random()) # 随机产生0到1之间的小数
print(random.randint(1, 6)) # 随机产生1到6之间的整数
print(random.uniform(1,100)) # 产生一个 区间 的随机浮点数
print(random.randrange(1, 100, 2)) # 随机产生指定的整数
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)
'''产生图片验证码: 每一位都可以是大写字母 小写字母 数字 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)
res = get_code(4)
print(res)
标签:10,内置,软件开发,random,datetime,模块,time,print,import
From: https://www.cnblogs.com/qian-yf/p/16807100.html